2013-12-25 3 views
2

В файле "file1.dat" Я написал "anahasapples".
И тогда я написал эту программу:Борьба с fputc в c

#include <stdio.h> 
    #include <conio.h> 

    int main() 
    { 
     FILE *ptr_file; 
     ptr_file=fopen("file1.dat","r+"); 
     printf("%c",fgetc(ptr_file)); 
     printf("%c",fgetc(ptr_file)); 
     printf("%c\n",fgetc(ptr_file)); 
     char c; 
     printf("char:\n"); 
     c=getch(); 
     fputc(c,ptr_file); 

     return 0; 
    } 

часть, где я печатаю первые 3 символа из файла работ. После этого я хочу поместить символ в файл.
Когда я компилирую это, я не получаю никаких ошибок, но содержащий текст не изменяется.

+2

Перед тем, как программа вернется, вам нужно «fclose». – mathematician1975

+3

@ mathematician1975: 'need to' не является истинным, так как файл закрывается, когда программа заканчивается. Однако это хороший стиль, чтобы явно закрыть файл. – alk

+0

@alk Да ** need ** был плохим выбором слова. Я имел в виду это, как вы описали, а не как необходимость. – mathematician1975

ответ

5

Documentation for fopen() Стандартно показывает следующее объяснение:

Когда файл открыт с обновлением режим (+ как второй или тир d в аргументе режима), как входные, так и выходные данные могут быть , выполняемые в связанном потоке. Однако вывод не должен быть , за которым следует вход без промежуточного вызова fflush (3C) или к функции позиционирования файла (fseek (3C), fsetpos (3C) или перемотка назад (3C)), а вход не должен быть за которым следует вывод без промежуточный вызов функции позиционирования файла, если только операция ввода не встречает конец файла.

Просто добавьте FSEEK() в код и все работает хорошо:

#include <stdio.h> 
#include <conio.h> 

int main() 
{ 
    FILE *ptr_file; 
    ptr_file=fopen("file1.dat","r+"); 
    printf("%c",fgetc(ptr_file)); 
    printf("%c",fgetc(ptr_file)); 
    printf("%c\n",fgetc(ptr_file)); 
    char c; 
    printf("char:\n"); 
    c=getch(); 
    fseek(ptr_file, 0, SEEK_CUR); /* Add this line */ 
    int err = fputc(c,ptr_file); 
    printf ("err=%d\n", err); 

    return 0; 
} 

Вот мой file1.dat до и после ввода 'х':

Перед

anahasapples

После

anaxasapples

Кажется, что по умолчанию fputc() пытается написать мимо конца файла, так что вам нужно переместить указатель файла (например, с помощью FSEEK), чтобы сделать запись происходит в точке текущего указателя файла.

+0

эй Рубин. Большое спасибо. Не могли бы вы объяснить мне, что означает параметр «0»? – user3078259

+0

Моя библия для функций C - die.net, для 'fseek' смотрите http://linux.die.net/man/3/fseek, в которой объясняется, что' 0' для дополнительного смещения, которое будет добавлено к ' SEEK_CUR'. Так как вы не хотите добавлять лишние * смещения *, то это '0'. – nonsensickle

+0

Позвольте мне указать вам документацию fseek() (например, http://www.cplusplus.com/reference/cstdio/fseek/) для полного объяснения.Вкратце, второй и третий аргументы работают вместе: указатель файла установлен в начало координат плюс смещение. Например, (10, SEEK_SET) означает «десять байт от начала файла», (12, SEEK_END) означает «12 байт от конца файла» и (0, SEEK_CUR) означает «установить указатель файла на текущий указатель файла (без смещения) ". –

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