чтение файла с помощью fscanf в цикле for - PullRequest
0 голосов
/ 24 августа 2018

У меня проблема с чтением из файла, первая печать вне цикла выполнена правильно. но внутри цикла for ничего не читается из файла. Я ищу объяснение или помощь, если кто-нибудь знает, что происходит. (при условии, что в файле n * m строк, разделенных "\ t \ r \ n") Благодарю.

{

char *file_name{
    char *new_num="    ";
    FILE *ifp=NULL;
    int i, j, n, m;

    ifp =fopen(file_name,"r");
    if (ifp!=NULL)
    {
        fscanf(ifp,"%d %d",&n,&m );

        printf("\n  Data from the file: %d, %d \n",n,m);
    }
for (i=0 ; i< n ;i++){
    for(j=0;j<m;j++){

fscanf(ifp,"%s",new_num);
printf("\n new num : %s ",new_num);

    }}
fclose(ifp);
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Чтобы прочитать что-то в переменную или указатель, вы должны выделить место.

char *new_num="    ";

Здесь он записывает строку в текстовом сегменте и дает этот указатель на new_num.

Я сделал небольшие изменения в вашем коде

#include <stdio.h>
#include <stdlib.h>
#define SIZE 50

int main()
{
    char *file_name;
    char new_num[SIZE];
    FILE *ifp=NULL;
    int i, j, n, m;

    file_name = "input.txt";
    ifp =fopen(file_name,"r");
    if (ifp!=NULL)
    {
        fscanf(ifp,"%d %d",&n,&m );
        printf("Data from the file: %d, %d \n",n,m);
    }
    for (i=0 ; i< n ;i++){
        for(j=0;j<m;j++){
            fscanf(ifp,"%s",new_num);
            printf("new num : %s\n ",new_num);
        }
    }
    fclose(ifp);
    return 0;
}

Путем интерпретации имени new_num как целого числа я советую вам использовать тип данных apt вместо% s

Для этого вам нужно изменить тип данных new_num

type new_num[SIZE];

и внутри fscanf используйте идентификатор apt.

0 голосов
/ 24 августа 2018
  • Вы присваиваете указатель new_num строковому литералу и пытаетесь его изменить. Это приведет к ошибке.

  • В этом утверждении: char * file_name {это может быть опечатка. имя_файла не назначено ни одной строке перед использованием.

0 голосов
/ 24 августа 2018

Когда вы делаете это:

 char *new_num="    ";

 ...

 fscanf(ifp,"%s",new_num);

вы указываете программе писать внутри строки. В некоторых системах эта строка может быть неизменной, и запись в нее может вызвать ошибку.

Попробуйте возможно:

 char *new_num = NULL;

 ...
 new_num = malloc(1024);
 if (NULL == new_num) {
     fprintf(stderr, "Out of memory?\n");
     exit(8);
 }

(Вышеприведенное исправляет «ошибку сегментации (сбрасывается ядро)», которую ваш код вызывает в моей системе, 64-битный Linux с glibc 2.27).

...