包含字符串和整数的打印文件,C程序

时间:2014-03-09 15:07:48

标签: c file scanf

首先,抱歉我的英语不好。

所以我的文件包含多个字符串和整数。

文件内容为

jonny#st.maria#100#200
antony#blabla#90#300
maria#chitchat#45#100

我的代码:

#include<stdio.h>

char name[10][20], school[10][20];

int op=0, score[8], dis[8];

int read(){
  FILE *op = fopen("test.txt","r");

  while(fscanf(op,"%[^#] # %[^#] # %d # %d",name[lis],school[lis],score[lis],dis[lis]) != EOF) 
    lis++;
  fclose(op);
}

它会崩溃吗?你能说出正确的方法吗?

1 个答案:

答案 0 :(得分:0)

您的数组是不同的大小(有些是8,有些是10个元素长)。您应该检查是否没有溢出最短的阵列。您显示的代码无法编译,因为未定义变量lis - 如果已定义,则需要确保它已初始化为0.

您的代码也具有误导性,因为您有一个全局变量int op = 0;,然后在read()函数内FILE *op

您应该检查fopen()的返回值,以确保它有效。不这样做并且无法打开文件是一个肯定的麻烦。

您需要将指向整数变量的指针传递给fscanf()

请注意,fscanf()可能会在格式不正确的数据上返回0(或确实123)。这些值都与EOF不同,都表示输入存在问题。 fscanf()的正确测试更接近:

int lis = 0;
while(lis < 8 && fscanf(op, "%19[^#] # %19[^#] # %d # %d",
                        name[lis], school[lis], &score[lis], &dis[lis]) == 4) 
    lis++;
fclose(op);
return lis;

请注意,我还将字符串限制为适合数组的大小,并返回已读取的学生数。

最后,就目前而言,我会发现read()并不是一个特别好的名字选择。虽然它是由标准C为用户保留的,但在POSIX系统上,read()是系统调用。更好的名称可能是read_students()