fgets () вылетает из моей программы - PullRequest
0 голосов
/ 04 декабря 2011

Я новичок в программировании на Си. Я пытаюсь открыть файл (juanjo2.klb), это двоичный файл, который я создал с помощью той же программы, которую я собираюсь показать здесь. Дело в том, что я пытаюсь использовать функцию fprintf (), чтобы напечатать строку в файл, а затем использовать fgets (), чтобы записать строку в строку 'cad', и использовать функцию printf (), чтобы напечатать в на экране строка, которую я прочитал из файла.

При запуске программы происходит сбой программы, и Windows (Windows 7) выдает мне сообщение о том, что моя программа перестала работать, и она находит решение проблемы. Так что я действительно не знаю, что я делаю неправильно, потому что я думаю, что я использую функции правильно. Мне нужна ваша помощь. Вот исходный код:

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

#define MAXCHARS 20

int main()
{
    char cad[MAXCHARS];
    FILE *pf;
    char *nombre = "\\juanjo2.klb";
    if(pf = fopen(nombre, "a+b") == NULL)
    {
       printf("Error opening file\n");
       exit(-1);
    }

    fprintf(pf, "%s", "Hola como estas");

    while(feof(pf) == 0)
    {
        fgets(cad, 13, pf);
        printf("%s", cad);//Here I print the string to the screen.
    }

    fclose(pf); //Closing file.

    system("PAUSE");
    return 0;

}

Я использую IDE Codeblocks 10.05. Спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 04 декабря 2011
if((pf = fopen(nombre, "a+b")) == NULL)

Это классика.

0 голосов
/ 04 декабря 2011
...

int main()
{
    .
    .
    .

    if(pf = fopen(nombre, "a+b") == NULL)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Как указано в ответе @ wildplasser (+1), ваша первая проблема находится в строке выше.


Это должно быть:

    if((pf = fopen(nombre, "a+b")) == NULL)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^

НазначаетFILE * to pf и ТОГДА проверяет, имеет ли он значение NULL


То, как оно у вас изначально, а именно:

   if(pf = fopen(nombre, "a+b") == NULL) /* wrong */

вы устанавливаете pf как результат `fopen (nombre,"a + b") == NULL, который будет либо 0, если логическое выражение (==) равно FALSE, либо! 0 (обычно 1), если оно истинно.Таким образом, pf имеет результат boolean, а НЕ фактический указатель файла.Это также вызывает проблемы с if, конечно, потому что теперь он смотрит на pf.

  pf = fopen(nomber, "a+b") == NULL; /* here to clarify == happens before = */

  if ( pf ) /* i.e. pf != 0 */ 
...