fscanf Issue-Не удалось извлечь строку из файла - PullRequest
0 голосов
/ 17 сентября 2018

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

void main()
{
    FILE *fp;
    char *str=NULL;
    char s;

    fp=fopen("text.txt","r");
    if(fp==NULL)
    {
        printf("\nCAN NOT OPEN FILE");

        exit(EXIT_FAILURE);
    }
 while(fscanf(fp,"%s",str)!=EOF) 
{
      printf("%s",str); //not taking any values in str,prints NULL 
  }

    fclose(fp);

}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Проблема с этим утверждением:

char *str=NULL;

Поскольку вы используете fscanf для чтения слов, которые являются символьными массивами, вы должны прочитать их в допустимую область памяти. Так что str должен быть массивом char, длина которого должна быть равна самому длинному слову в вашем файле плюс 1 (для нулевого завершения).

Поэтому измените вышеприведенное на:

char str[256];

7.21.6.2 Функция fscanf
...

12 Спецификаторы преобразования и их значения:

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

0 голосов
/ 17 сентября 2018

Здесь

char *str=NULL;

str - переменная-указатель, и она инициализируется с NULL, что очень хорошо, но сохранить что-то в str, то есть прочитать слово из файла и сохранить в str он должен иметь действительную память.Поэтому либо динамически выделяйте память для str

str = malloc(SIZE); /* define SIZE */

, либо используйте массив символов, например

char str[100]; /* let say each word of file is less than 100 char's */

Например,

char str[100];
while(fscanf(fp,"%s",str)!=EOF) {
      printf("%s",str); 
}

Также вместо void main() { }используйте

int main(void) {
    /* some_code */
    return 0;    
}

, как вы можете видеть из C Стандарт 5.1.2.2.1 Запуск программы .

...