Запись и отображение потока с форматом на C - PullRequest
0 голосов
/ 07 ноября 2011

Я на первом курсе информатики, и мне нужно разработать процедуру, которая записывает в файл с форматом (fprintf) и отображает его в формате (fscanf). Но я не могу заставить его работать должным образом; он компилируется, но когда он попадает в часть fscanf, он падает. Я искал справочные сайты, видео на YouTube и прочее, но я не могу заставить его работать без какого-либо успеха.

За исключением двух последних строк кода, все отлично. Он способен записывать записи, которые я ввожу, в файл .txt. Проблема с использованием самого fscanf.

void write_with_format()
{
    char  name_of_file[100] = "grades.txt";
    FILE *arch;
    arch = fopen (name_of_file, "a");
    char name[50];
    char career[50];
    char grades[100];
    char total;
    printf("Give me the name");
    gets(name);
    printf("Give me the career");
    gets(career);
    printf("Give me the grade");
    gets(grades);

    getchar();
    fprintf (arch, "%s,%s,%s\n",name,career,grades);

    fscanf(arch,"%s %s %f",&name,&career,&grades);

    printf("%s %s %f",name,career,grades);
}

Буду признателен за любую помощь в отношении моего кода или правильного использования fscanf, спасибо всем.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011
  1. Эта строка неверна:

    fscanf(arch,"%s %s %f",&name,&career,&grades);

    grades объявлено как char grades[100];, т.е. Строка, однако вы пытаетесь прочитать float в нее. То же самое касается строки printf под ней, вы используете %f и сообщаете printf, что вы передаете число с плавающей запятой, однако вы передаете массив. Вам также не нужно использовать оператор address-of (&) при передаче массивов функциям, как это было с fscanf.

  2. Вы должны использовать fclose, чтобы очистить буфер и закрыть поток файлов, как только вы закончите чтение / запись файла.

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

  4. Вы можете использовать rewind или fseek, чтобы установить позицию начала файла или вернуть определенную сумму, или вы всегда можете открыть файл заново. Я знаю, что у меня по крайней мере не было бы моего кода чтения в функции write_with_format.

  5. gets небезопасен и не должен использоваться, поскольку он может вызвать переполнение буфера, используйте fgets(stdin, SIZE...).

  6. Включите предупреждения вашего компилятора. Если случайно вы используете gcc, флаг -Wall. То, что ваш код компилируется, не означает, что он будет работать должным образом (или вообще).

0 голосов
/ 07 ноября 2011

Вы объявляете оценки как массив символов, но пытаетесь прочитать в них число с плавающей запятой.

...