2015-07-15 2 views
0

Недавно я начал работать с файловыми операциями в C, и я смог успешно скопировать содержимое одного файла в другой.Работа с файлом в C

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

Вот код, который я написал. Может кто-нибудь предложить, какая ошибка я здесь сделал?

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
int size = 0, index = 0; 

char byte = 0; 

FILE *fp_read, *fp_write; 

if ((fp_read = fopen(argv[1], "r+")) == NULL) 
{ 
    printf("Unable to Open File %s\n", argv[1]); 
} 

fp_write = fp_read; 

fseek(fp_write, 0, SEEK_END); 

size = ftell(fp_write); 

printf("The Size of the file %s:\t%d\n", argv[1], size); 

for (index = 0; index < size; index++) 
{ 
    if (fread(&byte, 1, 1, fp_read) != 1) 
    { 
     printf("Unable to Read from the file at Location:\t%d\n", index); 
    } 

    if (fwrite(&byte, 1, 1, fp_write) != 1) 
    { 
     printf("Unable to Write to the file at Location:\t%d\n", index); 
    } 
} 

if (fclose(fp_read)) 
{ 
    printf("Unsuccessful in Closed the File\n"); 
} 

return 0; 
} 

С уважением,

Наруто Узумаки

+0

Вы должны пометить язык (и * не * поместить его в заголовок). Это помогает людям найти его, а также изменяет работу синтаксиса highligting кода. – crashmstr

+1

Просто используйте указатель на один файл. fseek вернитесь к началу файла перед его чтением. Затем перейдите к концу, чтобы написать его (хотя указатель файла находится в конце, может понадобиться fseek). EDIT: от стандарта c99 "[для режима обновления] не следует напрямую следовать за входом без промежуточного вызова функции fflush или функции позиционирования файла (fseek, fsetpos или перемотка назад), и вход не должен сопровождаться непосредственно вывода без промежуточного вызова функции позиционирования файла, если только операция ввода не встречает конец файла « – ooga

+0

В заявлении ftell()« указатель файла »находится в конце файла. Поэтому fread() будет пытаться прочитать за конец файла, поэтому, естественно, fread() не работает, возвращая EOF. Копирование указателя дескриптора файла не создает второй доступ к файлу, он делает только копию указателя. вы можете просто вызвать fopen с режимом «a», чтобы установить указатель fp_write. – user3629249

ответ

2

Ваша ошибка лечения fp_read и fp_write, как если бы они не указывали на то же FILE объекта.

+0

@Siguza: Это заставляет их указывать на тот же объект 'FILE', как я уже сказал. Это означает, например, 'fseek (fp_write, 0, SEEK_END);' имеет тот же эффект, что и 'fseek (fp_read, 0, SEEK_END);'. – Hurkyl

+0

Да, вы правы. Оба указателя файла указывают на конец файла. –

1

Как и в предыдущем ответе, вы обрабатываете оба указателя, как если бы они ссылались на разные потоки FILE. Когда вы выполняете функцию fseek, вы меняетесь там, где находится указатель FILE. В качестве проверки попробуйте запустить ftell на обоих fp_read и fp_write и распечатать их, чтобы определить, находятся ли они в разных местах.

Редактировать: Как упоминалось в комментарии, вы можете открыть второй поток для переменной fp_write, как показано ниже.

fp_write = fopen("somefile", "a"); 
+1

Я бы сказал «разные потоки» вместо «разных файлов», так как можно было бы дважды открыть файл и иметь два разных потока, обращающихся к одному и тому же файлу, и в этом случае техника может работать. Не уверен, что это хорошая идея, конечно! – ooga

+0

Хорошая точка. редактирование – Dan

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