我应该从命令行参数打开一个文件并打印其中的值
#include <stdio.h>
int main(int argc, char* argv[])
{
float num;
char const* const filename=argv[1];
FILE* file=fopen(filename,"r");
char line[256];
int j=0;
while(fgets(line,sizeof(line),file)){
for( j=0; j<2; j++ )
{
if(j == 0)
{
fscanf(file, "%f", &num);
printf("%f t", num);
}
else if(j == 1)
{
fscanf(file, "%f", &num);
printf("%f n", num);
}
}
}
fclose(file);
}
这是我想得到的输出:
1 1
2 2
3 3
这就是我实际得到的:
1 1
2 2
3 3
3 3
我不明白这里发生了什么。
我在您的代码中做了两个更改。
更改
fscanf(file,"%f",&num);
进入
sscanf(line,"%f",&num);// here
您在循环中读取输入,但从文件指针中获取值。所以第一行将被跳过。然后在打开文件流的同时制作测试用例。
if ( file == NULL) {
perror("fopen");
return;
}
试试这个代码,我只做了上面的更改,
#include <stdio.h>
int main(int argc, char* argv[])
{
float num;
char const* const filename=argv[1];
FILE* file=fopen(filename,"r");
if ( file == NULL) {
perror("fopen");
return;
}
char line[256];
int j=0;
while(fgets(line,sizeof(line),file) != NULL){
for(j=0; j<2;j++)
{
if(j==0)
{
sscanf(line,"%f",&num);
printf("%f t",num);
}
if(j==1)
{
sscanf(line,"%f",&num);
printf("%f n",num);
}
}
}
fclose(file);
}
输出:
130.000000 130.000000
210.000000 210.000000
650.000000 650.000000
324.000000 324.000000
您的问题是用fgets
读取第一行,然后用fscanf
开始读取下一行。换句话说,在fgets (line, LMAX-1, file)
之后,文件位置指示器位于第1行的末尾。然后fscanf(file, "%f", &num);
(它跳过第1行末尾的'n'
并读取第2行的值)。您想要:
while (fgets (line, LMAX-1, file)) {
for (j = 0; j < 2; j++) {
if (j == 0) {
sscanf (line, "%f", &num);
printf ("%f t", num);
} else if (j == 1) {
sscanf (line, "%f", &num);
printf ("%f n", num);
}
}
}
然后输出变为:
./bin/dbllast dat/dbllast.txt
1.000000 1.000000
2.000000 2.000000
3.000000 3.000000