繁体   English   中英

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

[英]reading a file with fscanf in a for loop C

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

执行此操作时:

 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)上导致的“分段错误(内核已转储)”)。

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

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

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

  • 在此声明中:char * file_name {这可能是一个错字。 在使用file_name之前,未将其分配给任何字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM