我一直在努力理解scanf及其实际工作原理。我有以下文本文件:
this is a test !
25.0 400.0 400.0 0.0 0.0
20.0 200.0 400.0 3.0 4.0
30.0 50 600.0 1 .0 2.0
50.0 400.0 200.0 1 .0 -2.0
40.0 700.0 700.0 -1 .0 -2.0
基本上,代码应该读取每一行并将它们分配给单个数组(数组A从第一列获取浮点数,数组B从第二列获取浮点数,依此类推)。我唯一能理解的是如何打开文件进行阅读:
FILE *file = fopen( argv[1], "r" );
但我无法弄清楚如何从第1,2,3和4行中提取双打。我使用条件语句顺便跳过第1行。我用以下内容阅读其余内容:
while (fgets(line, sizeof(line), file))
{
if (count < 1)
{
//printf("%s", line);
count++;
}
else
{
printf("%s", line);
}
}
线条正在打印,但又一次......不确定如何提取每个单独的数字。帮助将不胜感激。
编辑:选择解决方案
以下是我在此测试应用程序中使用的代码。正如答案中所提到的,文本文件有一些拼写错误,使得扫描数据变得更加困难,需要在运行代码之前对其进行编辑。此外,必须添加“int i = 0”的声明才能处理数组。
while (fgets(line, sizeof(line), file))
{
if( 5 == sscanf(line, "%f%f%f%f%f", &A[i], &B[i], &C[i], &D[i], &E[i]) )
{
i++;
}
else
{
printf( "Parse failed\n" );
}
}
答案 0 :(得分:2)
这样的事情:
if( 5 == sscanf(line, "%f%f%f%f%f", &A[i], &B[i], &C[i], &D[i], &E[i]) ) {
/* Do something with values */
} else {
printf( "Parse failed\n" );
}
其中i
为每个有效数据行递增。
答案 1 :(得分:1)
在这样的循环中使用strtok()
和atof()
,它将为您提供一个5 x 10的数组:(基本上是5个数组,每个数组最多可容纳10个浮点数)
我在OP输入文件中选择了额外的空格可能是问题的一部分?我在第3行和第4行的输入中删除了额外的空格,即将1 .0
更改为1.0
)(而且,当我现在看OP时,我看不到额外的空格)无论如何,尝试将文件读入数组:
25.0 400.0 400.0 0.0 0.0
20.0 200.0 400.0 3.0 4.0
30.0 50 600.0 1.0 2.0
50.0 400.0 200.0 1.0 -2.0
40.0 700.0 700.0 -1.0 -2.0
int main(void)
{
char *buf;
char line[80];
float A[5][10];//hard-coded to accommodate the input file, change as necessary.
FILE *file;
file = fopen("c:\\dev\\play\\test.txt", "r");
int i=0, j=0;
i = -1;
j = -1;
while(fgets (line, sizeof(line), file))
{
j++;
buf = strtok(line, " \n\t");
while(buf)
{
i++;
A[i][j] = atof(buf);
buf = strtok(NULL, " \n");
}
i=-1;
}
fclose(file);
}
输出将是5个数组A [0]到A [4],每个数组包含5列的内容。