LINUX.ORG.RU

прочитать содержимое файла куда-нить, затем добавить в начало нужную строку, а затем дописать пробыкапленные данные.
а, вообще, это дело sed'а: sed -i '1s/^/sometext\n/' somefile

saahriktu ★★★★★
()

Так #перезаписать" или "вставить"? Первое тривиально, второе потребует перезаписи всего файла (хотя весь его бэкапить в другое место не нужно, просто, начиная с конца, "отодвигать" по кускам на нужное расстояние).

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

мой способ
создать файл с одной строкой
дописать в него уже имеющийся файл

отмапить файл в память... не так не получится

anonymous
()
Ответ на: комментарий от anonymous

> А если файл гига на 4? Долго же двигать. Неужели нет более красивого способа?

Нет, и в принципе быть не может.

fmj
()
Ответ на: комментарий от s0ldat

>> Так #перезаписать" или "вставить"?

> перезаписать строкой байты в начале файла

Ну так это элементарно:

lseek(fd, 0, SEEK_SET);
write(fd, yourstring, yourstring_size);

И всё, первые yourstring_size байтов файла перезаписаны.

tailgunner ★★★★★
()
Ответ на: комментарий от fmj

>Нет, и в принципе быть не может.

_В принципе_ быть может. Например, если научить ОС понимать отрицательные fseek и научить начинать файлы не от начала кластера :)

KRoN73 ★★★★★
()
Ответ на: комментарий от tailgunner

> Ну так это элементарно:

> lseek(fd, 0, SEEK_SET); > write(fd, yourstring, yourstring_size);

> И всё, первые yourstring_size байтов файла перезаписаны.

Я так и сделал, но может протормозил где, так как строка "обрезает" файл, то есть пишется и после нее (кроме нее) уже ничего в файле нет.

Если эффект должен быть иной, приведу исходник в студию

s0ldat
() автор топика
Ответ на: комментарий от s0ldat

> строка "обрезает" файл, то есть пишется и после нее (кроме нее) уже ничего в файле нет.

Хм... ты его с случайно не с O_TRUNC открываешь?

tailgunner ★★★★★
()
Ответ на: комментарий от s0ldat

>так как строка "обрезает" файл

seek в конец файла сделай перед закрытием. Или в append-режиме открывай.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> >так как строка "обрезает" файл

> seek в конец файла сделай перед закрытием. Или в append-режиме
> открывай.

IMO феерический бред.
1. такой seek абсолютно бессмысленнен
2. O_APPEND конечно полезный флаг, но к этому случаю отношения не имеет

HTH


Onanim
()

записать или вставить ? записать легко - сделать seek() на начало файла, второе без сдвига - перезаписи никак увы - невозможно в принципе на существующих ОС.

alphex_kaanoken ★★★
()
Ответ на: комментарий от Onanim

>IMO феерический бред.

Эх, не работали вы с Си++ во времена BC++3.1 или Watcom 9 :)
Действительно, сейчас позиционирование в конец не нужно, а append
вообще не позволяет переписывать исходный контент.

Тогда просто непонятно, в чём проблема. На тесте всё работает отлично:

#include <stdio.h> 

int main(void)
{
    FILE *fp = fopen("test", "wb");
    fputs("0123456789", fp);
    fclose(fp);

    fp = fopen("test", "r+b");
    fseek(fp, 0, SEEK_SET);
    fputs("abc", fp);
    fclose(fp);

    return 0;
}

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Эх, не работали вы с Си++ во времена BC++3.1 или Watcom 9 :)
> Действительно, сейчас позиционирование в конец не нужно, а append
> вообще не позволяет переписывать исходный контент.

Что значит "сейчас"?
Интересно когда (и в каких Unix системах) такое позиционирование
было необходимо в данном конкретном случае?

Onanim
()
Ответ на: комментарий от KRoN73

to KRoN73: СПАСИБО!

я открывал файл в режиме "w" а не "r+", потому и конец записываемой строки обрезал файл.

----------------------------------

На эту тему доштудировал ман-страницу по fopen:

The argument mode points to a string beginning with one of the following sequences (Addi- tional characters may follow these sequences.):

r Open text file for reading. The stream is positioned at the beginning of the file.

r+ Open for reading and writing. The stream is positioned at the beginning of the file.

w Truncate file to zero length or create text file for writing. The stream is posi- tioned at the beginning of the file.

w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file.

a Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file.

a+ Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.

The mode string can also include the letter ``b'' either as a last character or as a charac- ter between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the ``b'' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the ``b'' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-Unix environments.)

s0ldat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.