【问题标题】:C programming reading multiple integers in same lineC编程在同一行中读取多个整数
【发布时间】:2021-02-26 13:13:45
【问题描述】:

我正在尝试读取一个包含整数的 .txt 文件并将其存储在结构数组中。我可以使用以下代码读取具有附加字符数据的第一个文件,如下所示:

fp = fopen("test.txt", "r");
while(fscanf(fp, "%s %d %d %d %d", a[i].letter , &a[i].hor, &a[i].width , &a[i].ver, &a[i].height)==5 && i<LineCount){
    
    if(ferror(fp)  ||  feof(fp)) break;
    i++;
}
  • A 10 213 20 20
  • B 100 10 150 15
  • ....

但是,在那之后,当我尝试使用以下代码读取另一个具有以下格式的文件时:

file1 = fopen("beg.txt", "r");
    printf("HELLOOOO");
    while(fscanf(file1, "%d %d %d %d", &b[i].id, &b[i].hor, &b[i].ver, &b[i].time)==4 && i<LineCount){
    printf("HEYY");

        if(ferror(file1)  ||  feof(file1)) break;
    
        i++;
    }

格式:

  • 1 10 100 100
  • 2 100 10 100
  • 3 172 172 18
  • ....

fopen 不返回 NULL,所以它打开了,我可以看到“HELLOOOO”,但它永远不会进入“HEYY”并且程序退出,不是立即退出,而是在短时间内退出。我仔细检查了所有内容,文件和结构格式正确,我正在执行与第一个完全相同的操作,但它不起作用。

如果您知道我做错了什么或可能出现的问题,我将不胜感激您的 cmets。

【问题讨论】:

  • 读取第二个文件之前i的值是多少?老实说,从我读到的内容来看,您还没有尝试所有方法。例如,您的fscanf() 是否失败?请多花点时间,这是一个非常简单的程序,您应该可以使用一些打印语句或在调试器中进行调试。
  • 感谢您的评论。 i 为 0。我实际上在每一步都尝试过打印,但我无法检测到问题的根源。我刚刚想通了一些事情。如果我不阅读第一个文件,我可以阅读第二个文件。另外,如果我在 main 中声明了一个变量,并在读取之前为其分配了一个值。我什至无法读取一个文件。因此,如果我声明的变量多于当前变量,我将无法读取文件,或者如果读取了文件,我将无法读取另一个文件。我对C没有那么丰富的经验,所以我对这些东西一无所知。这是内存相关问题还是硬件问题?
  • 也许i&gt;=LineCount ?
  • 请创建仍然存在此问题的最小完整程序并将其与文件的前几行一起发布。目前你只展示了几件,所以猜测可能是什么问题。你为什么会为这样的程序考虑硬件或内存问题?你是在内存非常有限的有缺陷的微控制器板上运行它吗?
  • 好的,我会以这种方式重新发布问题。我认为因为我在函数中读取文件并且它可以工作,所以我在该函数之前在 main() 中声明了任何变量并且它停止工作。任何变量,例如int u = 0

标签: c file scanf fopen dev-c++


【解决方案1】:

在这里,我从头开始创建了另一个程序,并在 main.js 中完成了所有操作。仍然有同样的问题。第一个文件被读取,存储在结构中并打印没有问题。但是,对于第二个文件,即使 fopen() 这次也不起作用,它也不会返回任何值,null 或 -1。它只是等待并退出程序。

结构:

struct data{
        char name[2];
        int a,b,c,d;
    };

struct fix{
    int x,y,z,u;
};

读取第一个文件:

    char c;
    
    
    int lineCount = 1;
fp = fopen("data.txt", "r");
 for (c = getc(fp); c != EOF; c = getc(fp)){ //Get the number of lines
        if (c == '\n'){ 
            lineCount = LineCount + 1; 
            }
             }      
    fclose(fp);     
    
int i=0;
struct data* a;
a = (struct data*)malloc(sizeof(a)*lineCount);  //Allocate memory for a      

fp = fopen("data.txt", "r");
if(fp==NULL) printf("Null\n");
while(fscanf(fp, "%s %d %d %d %d", a[i].name , &a[i].a, &a[i].b , &a[i].c, &a[i].d)==5 && i<lineCount){
    
    if(ferror(fp)  ||  feof(fp)) break;
    i++;

fclose(fp);
for(i=0;i<lineCount;i++){

printf("%s, ", a[i].name);
printf("%d, ", a[i].a);
printf("%d, ", a[i].b);
printf("%d, ", a[i].c);
printf("%d\n", a[i].d);
}

读取第二个文件:

lineCount = 1;

//files=fopen("beg.txt","r");
if(files=fopen("beg.txt","r")==NULL) printf("Hey"); //STUCK HERE!

if(files==NULL) printf("NULL2");
 for (c = getc(files); c != EOF; c = getc(files)){ //Get the number of lines
        if (c == '\n'){     //Get t
            lineCount = lineCount + 1; 
            }
             }
        
struct fix* b = (struct fix*)malloc(sizeof(b)*lineCount);   //Allocate memory for b     

files = fopen("beg.txt", "r"); 
while(fscanf(files, "%d %d %d %d", &b[i].x, &b[i].y , &b[i].z, &b[i].u)==4 && i<lineCount){
    
    if(ferror(fp)  ||  feof(fp)) break;
    i++;
}

【讨论】:

  • 鉴于char c;c != EOF 将不起作用,因为EOFint,而不是charc != EOF 将无法检测到文件结尾,或者当从文件中读取的char 值提升为int 并与EOF 的实际位匹配时,它将过早检测到文件结尾整数值。出于这个原因,getc() 返回 int 而不是 char
  • 我明白了。但它适用于第一个文件,这是一种常用的做法,我错了吗?你认为这可能会导致我遇到的问题吗?我还能怎么计算行数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2010-09-14
  • 2010-11-28
相关资源
最近更新 更多