2015-02-21 2 views
0

Мне нужно прочитать содержимое двоичного файла в буфер, выполнить операцию над этим буфером, а не переписывать содержимое этого же файла с выходным буфером.Перезапись файла с использованием O_TRUNC

#include <fcntl.h> 
#define BUFFSIZE 1024 
char in[BUFFSIZE], 
    out[BUFFSIZE]; 

void main(char argc, char **argv) 
{ 
    int file = open(argv[1], O_RDONLY); 
    int size = read(file, in, BUFFSIZE); 
    hash(in, out, size); 
    close(file); 
    file = open(argv[1], O_WRONLY, O_TRUNC); 
    write(file, out, size); 
    close(file); 
} 

Если открыть файл с помощью O_RDWR, а затем использовать write(), мой выходной буфер добавляется в конец файла. Если я закрываю и повторно открываю файл с O_TRUNC, он не усекает его - выходной буфер меньше ввода, поэтому остаток старого содержимого можно увидеть в конце файла. С другой стороны, использование O_WRONLY делает файл, к которому у меня нет разрешения на запись. Я знаю, как это сделать, используя fopen() и fprintf(), но я хотел бы избежать этого и, если возможно, избежать ненужного закрытия (используйте какую-то перемотку).

+0

Я думаю, что вы хотели бы использовать lseek для позиционирования указателя файла при начале файла при его переписывании. –

ответ

1

Изменения второго открытого вызова

file = open(argv[1], O_WRONLY | O_TRUNC); 

, и я думаю, что вы получите то, что вы хотите.

BTW, вы должны проверить результаты возврата от таких вещей, как открывать, читать, писать и закрывать.

+0

Не забудьте режим. – user3710044

+0

Только для O_CREAT – DrC

+0

О да, возможно, привычка DOS. IIRC вы не можете отделить O_CREAT и написать. – user3710044

Смежные вопросы