我在这里有这个文本文件:
6
81.00
1
27
2004
8
7.00
1
2
2009
14
97.00
4
4
2001
10
38.00
5
17
2006
我试图将所有这些值读入数组。以下是我提出的一些代码:
int a[20], i, m;
FILE *fn;
fn = fopen("test.txt", "r");
m = 0;
i = 0;
while(!feof(fn)){
for(i = 0; i < 20 ;i+=1){
fscanf(fn, "%d", &a[i]);
printf("%d ", a[i]);
}
m += 1;
}
此代码正确读取文本文件的第一个值,因为它是一个整数,但然后错误地读取其余值,我假设它是因为文本文件中的第二个值是浮点数。我不确定这是否可能在C中,但如果是,我很确定从浮点行分别读取整数线是可行的。任何帮助表示赞赏。
答案 0 :(得分:2)
查看输入文件,在输入模式重复之前,您有一个int
,然后是double
(或float
)和另外三个int
值。您将阅读与输入相匹配。如果您在循环中阅读并int
,double
和另外3个int
值,则可以正确读取文件中的数据,然后您可以存储或使用但是你喜欢int
,double
和int, int, int
。
关键是将读取循环与输入匹配。
没有什么可以说你不能一次循环读取一个值,直到EOF
保持一个计数器(例如用int n = 0;
),然后使用一些 whacky逻辑喜欢
if (n) {
if (n == 1) /* read double; n++ */
else if (n == 4) /* read int; n = 0; */
) else /* read int, n++ */`
但这肯定是解决问题的一种奇怪方式。或者您可以利用scanf
的数字格式说明符将跳过前导空格(换行符为空格)并在单个循环中读取所有值的事实。
这是一个不那么糟糕的方法的简单例子。然后,您可以在数组中选择所需的任何值并相应地填充数组,例如
#include <stdio.h>
int main (int argc, char **argv) {
int id, mo, day, year; /* 4-int values */
double val; /* 1-double value */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
/* read an int, double, int, int, int, use as required */
while (fscanf (fp, "%d %lf %d %d %d", &id, &val, &mo, &day, &year) == 5)
printf (" %02d/%02d/%04d %2d %5.2f\n", mo, day, year, id, val);
if (fp != stdin) fclose (fp); /* close file if not stdin */
return 0;
}
注意:通常更好的方法是使用fgets
然后sscanf
来解析缓冲区中的值(允许独立验证读取和解析)。然而,当故意吃线作为空格结束时,fscanf
单独可以提供一个优势(唯一的情况之一是真实的)。
示例输入文件
$ cat prodid.txt
6
81.00
1
27
2004
8
7.00
1
2
2009
14
97.00
4
4
2001
10
38.00
5
17
2006
示例使用/输出
以下只是使用通过循环读取每个行程的值的示例:
$ ./bin/rdprod <prodid.txt
01/27/2004 6 81.00
01/02/2009 8 7.00
04/04/2001 14 97.00
05/17/2006 10 38.00
仔细看看,如果您有任何问题,请告诉我。