Форум программистов, компьютерный форум CyberForum.ru

Запись в начало файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
kold2015
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 158
19.08.2014, 10:13     Запись в начало файла #1
Здравствуйте мне нужно записать слово "zashivrovano" в начале каждого файла:
я так понял алгоритм следующий:
1) Создаем новый файл

2) Пишем в него слово Zsdhifrovano

3) Дописать данные из старого файла

4) удалить старый файл

5) Переименовать новый файл в имя старого

Вопрос:

А какой функцией дописывать данные из старого файла в новый?

и вопрос лучше реализовывать с помощью потоков ofstream и ifstream

я так понял файл нужно считать в буфер но если файл большой допустим 2гб?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
A_Kamolins
 Аватар для A_Kamolins
4 / 4 / 4
Регистрация: 15.08.2014
Сообщений: 30
19.08.2014, 10:57     Запись в начало файла #2
Мне кажется, что можно было просто открыть файл, переставить указатель в начало и оттуда начать запись в файл. Всё старое просто передвинется, а то, что тебе было необходимо записать - окажется в самом начале. Ну, если я не прав, можно просто считать из файла в вектор к примеру, затем перезаписать в него то, что тебе надо, после чего - дозаписать то, что ты считал в вектор.

И - да, думаю тут лучше ifstream, ofstream / fstream
kold2015
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 158
19.08.2014, 11:04  [ТС]     Запись в начало файла #3
"просто считать из файла в вектор к примеру"

как это делается?
A_Kamolins
 Аватар для A_Kamolins
4 / 4 / 4
Регистрация: 15.08.2014
Сообщений: 30
19.08.2014, 11:24     Запись в начало файла #4
kold2015, вы не пробовали сперва просто дописать эту фразу в начало файла?

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main() {
    ifstream input("file.txt");
    vector<int> vec;
    copy(istream_iterator<int> (input), istream_iterator<int>(), back_inserter(vec));
    copy(vec.begin(), vec.end(), ostream_iterator<int> (cout, " ") );
}
kold2015
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 158
19.08.2014, 11:53  [ТС]     Запись в начало файла #5
гуглил везде вроде пишут что нельзя добавит в начало файла
нужно действовать по алгоритму который я написал выше
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
19.08.2014, 11:55     Запись в начало файла #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/////////////////////////////////////////////////////////////////////////////////////////
//нужно записать слово "zashivrovano" в начале каждого файла
/////////////////////////////////////////////////////////////////////////////////////////
#include <complex>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
template< class T >
void    file_push_front
        (
            T_str   const   &   filename,
            T       const   &   val
        )
{
    std::fstream        file( filename );
    std::ostringstream  sout;
 
    sout    <<  val
            <<  file.rdbuf();
 
    file.seekp(0);
    file    <<  sout.str();
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_file( T_str   const   &   filename )
{
    std::ifstream   ifile( filename );
 
    std::cout   <<  ifile.rdbuf()
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    const   T_str   FILE_NAME   =   "out.txt";
    std::ofstream   ofile( FILE_NAME );
 
    file_push_front
        (
            FILE_NAME,
            1111111111
        );
 
    file_push_front
        (
            FILE_NAME,
            "aaaaaaaaaa"
        );
 
    file_push_front
        (
            FILE_NAME,
            std::complex<int>( 55, 777 )
        );
 
    file_push_front
        (
            FILE_NAME,
            "zashivrovano"
        );
 
    print_file( FILE_NAME );
 
    system("pause");
}
kold2015
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 158
20.08.2014, 10:13  [ТС]     Запись в начало файла #7
сделал я через временный файл

Добавлено через 17 часов 16 минут
вот моя реализация

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void priznakshifr(QString put)  //put-- outFilePath
{
    QMessageBox msg;
    //put ???????? ????
 
    QByteArray ar=put.toLocal8Bit();  //????????? ?????? ??? ????? ? ????????? ?? char
    char *imystarfaila=ar.data();
 
    msg.setText(QString::fromLocal8Bit("??? ????????? ?????  ")+QString::fromLocal8Bit(imystarfaila));
    msg.exec();
 
    QFile file(put);  //?????????? ?????? ??????? ????? ? ?????? //???? ????? ?????????-outfilepath
    qint64 pere=file.size();  // ?????? ?????? ????? ? ??????
    char buf[pere];  // ??????? ?????? ??? ???????? ?????????? ??????? ?????
 
    QString rr=QFileInfo(put).absoluteFilePath();  //?????? ?????? ???? ? ?????
    QString novfail=rr+"1";   //??? ?????? ?????????? ?????  //??? ?????????? ?????
 
    QByteArray br=novfail.toLocal8Bit();   // ????????? ????? ??? ????? ? ????????? ?? char
    char *imynovfaila=br.data();
 
    msg.setText(QString::fromLocal8Bit("??? ?????? ????? ")+QString::fromLocal8Bit(imynovfaila));
    msg.exec();
 
    ofstream f(imynovfaila);   //????????? ????? ????????? ???? (???? ??? ??? ?? ??????? ??? ?????????????)
    f<<"zashivrovano";  // ????? ? ???? ???????? ?????
 
    ifstream g;
    g.open(imystarfaila);   // ????????? ?????? ????
    g.read(buf,pere);  // ?????? ?????? ? ????? ?? ??????? ?????
    f.write(buf,pere);  // ????? ?? ?????? ? ????? ????
 
    file.remove();  //??????? ?????? ????
 
 
    QFile file2(novfail);   // ??????????????? ????? ???? ? ??? ???????
    file2.rename(put);
 
    msg.setText(QString::fromLocal8Bit("??? ????????? ????? ????? ???? ????????")+QFileInfo(file2).absoluteFilePath());
    msg.exec();
 
 
 
    g.close();
    f.close();
только подойдет ли для больших файлов?
Unifan
 Аватар для Unifan
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 40
20.08.2014, 18:25     Запись в начало файла #8
А нельзя просто использовать имя-потока.seekp(кол-во байтов, ios::end)? Смещаем указатель в начало файла с конца, и выводим в него имя-потока << "zashifrovano\n";

Просто так проще получается, нежели приведенные варианты выше, не?
kold2015
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 158
20.08.2014, 19:39  [ТС]     Запись в начало файла #9
помойму нельзя файл затирается
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2014, 19:44     Запись в начало файла
Еще ссылки по теме:

C++ Узнать начало файла
Запись в начало массива C++
C++ Запись данных в начало файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Unifan
 Аватар для Unifan
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 40
20.08.2014, 19:44     Запись в начало файла #10
kold2015, а почему ты не рассмотрел вариант копирования файла в буфер с помощью get(), вывода требуемого слова и последующим выводом файла?
Yandex
Объявления
20.08.2014, 19:44     Запись в начало файла
Ответ Создать тему
Опции темы

Текущее время: 17:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru