我应该从命令行参数打开一个文件并在其中打印值。这是我的代码:
#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
我不知道这里发生了什么。
答案 0 :(得分:1)
我在代码中做了两处更改。
变化
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
答案 1 :(得分:0)
您的问题是,您使用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