2009-12-01 122 views
0

如何读取用分号分隔的不同数据记录到C中的数组中?读取以分号分隔的文本文件中的不同数据C

from textfile:Text One; 12.25;文字二; 5;正文三; 1.253

fopen ... 
for(i = 0; i < nrRecords; i++) { 
fscanf(myFile, " %[^;];", myRecords[i].firstText); /* Ok first text*/ 
fscanf(myFile, "%lf", &myRecords[i].myDouble1);  /* But goes wrong with first double */ 
fscanf(myFile, " %[^;];", myRecords[i].secondText); 
fscanf(myFile, "%d", &myRecords[i].myInt1);  
fscanf(myFile, " %[^;];", myRecords[i].thirdText); 
fscanf(myFile, "%lf",&myRecords[i].myDouble2);  
} 
fclose... 
+0

如果以字符串形式读取每个字段%[^;],是否会得到正确的文本(例如,第二个字段中的“12.25”)? – 2009-12-01 09:57:36

+0

没问题,我正在将它读入带有“固定”类型的structarray。 – 2009-12-01 10:13:06

+1

我试过了,它工作正常。你可以显示myRecord结构的定义吗? – bhups 2009-12-01 10:14:10

回答

-1

的一种方法是使用strtok。然后以int或float形式输入结果。

1

通常的建议是读整行,然后用sscanf或strtok或其他方法解析它。如果直接从文件中直接扫描,则很容易在输入文件中丢失位置。 (即第一次不匹配,你需要一种方法来跳过它,除非你想在那里中止)。

+0

如何容易失去你的位置?跳过其余部分并不难,如果你错误地抛弃了当前行,那么这就是你所做的一切:'void ignoreline(FILE * f){char c; for(;;)switch(fgetc(f)){case'\ n':case EOF:return;默认:; ''。 – 2010-02-22 09:54:58

0

我会用fgets从文件中读取一行,strtok将其打开分号strcpy复制字符串,strtod转换为double并且strtol转换为long(然后转换为整数)。

或者,阅读该行并使用状态机遍历每个字符并执行正确的操作。例如,您要将每个字符复制到firstText中,直到您达到分号,然后使用strtod来吃掉double,跳过分号,将字节复制到secondText等。

或者,使用单个scanf格式串破线下行到各个领域

fscanf(myFile, " %[^;];%lf;%[^;];%d;%[^;];%lf", 
    myRecords[i].firstText, 
    &myRecords[i].myDouble1, 
    myRecords[i].secondText, 
    &myRecords[i].myInt1, 
    myRecords[i].thirdText, 
    &myRecords[i].myDouble2); 

而且,正如其他人所说,检查fscanf返回值。

我更喜欢每次阅读一行,以避免出现单行不良行,导致后续所有转换失败。