在for循环C中使用fscanf读取文件

时间:2018-08-24 14:22:21

标签: c file scanf

我从文件读取时遇到问题,循环外的第一次打印正确完成。但是在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 :(得分:1)

执行此操作时:

 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);
 }

(以上方法解决了代码在我的系统(带glibc 2.27的64位Linux)上导致的“分段错误(核心转储)”。

答案 1 :(得分:1)

为了将某些东西读入变量或指针,您应该分配空间。

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标识符。

答案 2 :(得分:0)

  • 您将指针new_num分配给字符串文字,然后尝试对其进行修改。这将导致错误。

  • 在此语句中:char * file_name {这可能是错字。 file_name在使用前未分配给任何字符串。