我想知道是否有办法在扫描文件内容时检查文件的输入是否有效。
例如,如果我要扫描一个名为 filename 的文件,我希望该文件包含未定义数量的集,其中包含 5 个元素,即名称、性别、年龄、身高和体重。我将为该程序创建一个链表。
所以我将创建 typedef 结构体:
typedef struct nodebase{
char name[20];
char sex; //M for male and F for female
int age;
double height; // Height shall be rounded off to 2 decimal points
double weight; // Weight shall be rounded off to 2 decimal points
struct nodebase *next;
}listnode;
int main()
{
int totalsets; //Counter for total numbers of "sets" within the file
char filename[20];
listnode *head;
listnode *tail;
listnode *current;
FILE *flist;
printf("Type the name of the file for the list: n");
scanf("%s",filename);
然后在扫描文件中所有可能的"集"时,
flist = fopen(filename,"r");
while(!feof(flist))
{
if(5 == fscanf(flist,"%s[^n]%c%d%lf%lf",¤t->name,¤t->sex,¤t->age,¤t->height,¤t->weight)
{
totalsets++;
}
(这是我的问题(:如何让程序告诉用户某些文件输入是否错误(但程序仍将计入那些有效的"集合"(?
就像文件有一个包含整数的集合,而它应该是性别的字符
另一个问题是,程序(在检测到此类无效输入后(是否可以接受用户的编辑并覆盖集合中无效输入部分的编辑?
非常感谢!
*我还没有完成整个编码。我被困在这里,所以我只想在继续之前完成这部分。*我的问题可能已经有答案了,但坦率地说,我不明白......
我在Windows上使用VS2012。
使用 fgets()
和 sscanf()
。
char buf[256];
while(fgets(buf, sizeof buf, flist) != NULL) {
if(5 == sscanf(buf,"%19s %c%d%lf%lf", ¤t->name,...) {
totalsets++;
}
}
一些格式更改:
"%s[^n]"
是无效的语法。 无论如何,%s
不会扫描n
。
在分配性别之前,使用" %c"
消耗空间。
一般来说,你有一个语法问题:你的文件单独的名称如何形成性别? 名称中可能出现空格,也可能不显示空格。 一个名称中可以有多个空格。 经典的习语是使用逗号分隔的值,如下所示
if(5 == sscanf(buf,"%19[^,] , %c ,%d ,%lf ,%lf", ¤t->name,...) {