【问题标题】:reading a file with fscanf in a for loop C在 for 循环 C 中使用 fscanf 读取文件
【发布时间】:2018-08-24 14:22:21
【问题描述】:

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

【问题讨论】:

  • 这段代码还能编译吗?
  • 请在我们查看之前修复格式并发布完整的代码...
  • 您的程序写入字符串文字,因此它至少具有未定义的行为。
  • Post 缺少可编译的代码和示例输入以及预期的输出。提供这些可以使帖子更好。评论minimal reproducible example
  • 关于:ifp =fopen(file_name,"r"); if (ifp!=NULL) 整体逻辑表示如果对fopen() 的调用失败,则不要执行if() 代码块内的代码` 到目前为止。然后,在if() 代码块之后(不知道对fopen() 的调用是否成功)代码尝试使用从fopen() 返回的值(可能为NULL)来尝试访问一份文件。强烈建议调用fopen() 后的第一条语句为: if( !ffp ) { perror( "fopen failed" );退出(EXIT_FAILURE); } // 暗示 else, fopen 成功`

标签: c file scanf


【解决方案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】:

    当你这样做时:

     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)。

    【讨论】:

      【解决方案3】:
      • 您将指针 new_num 分配给一个字符串文字并尝试修改它。这将导致错误。

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

      【讨论】:

        猜你喜欢
        • 2021-06-22
        • 2021-04-05
        • 2011-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多