fgets()不打印已打开文件的第一行。 这是我已经完成的代码,
#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;
if(file!=NULL)
{
while(fgets(line,sizeof(line),file)!=NULL){
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);
}
}
我得到输出,
650.000000 699.000000
99.000000 132.000000
150.000000 272.000000
128.000000 291.000000
302.000000 331.000000
95.000000 199.000000
代替,
130.000000 186.000000
650.000000 699.000000
99.000000 132.000000
150.000000 272.000000
128.000000 291.000000
302.000000 331.000000
95.0000000 199.000000
我不知道第一行是我的问题。请帮我解决这个问题。
答案 0 :(得分:3)
您的fgets
将第一行读入line
,您永远不会使用。然后,您继续使用line
从文件(而不是fscanf
)中读取数字。对fgets
的进一步调用基本上消耗了文件中的换行符。尝试将fscanf
切换为sscanf
并从line
而不是file
读取,或者完全删除fgets
并根据返回退出循环价值fscanf
。
答案 1 :(得分:0)
fgets()
不会打印任何内容。它只读取输入。
无论如何,您的问题是 - 每次通过while
循环时,操作都是fgets()
的一次调用(while
循环条件),然后是两次调用{ {1}}。仅输出使用fscanf()
读取的结果。
第一次循环时,第一行fgets()接收的数据被简单地丢弃 - 所以第一行根本不会输出。
在后续迭代中,没有跳过输出的唯一原因是你很幸运。 fscanf()
- 使用您的格式字符串 - 在遇到空白字符时停止读取,但是等待从文件中读取该字符。如果这是换行符,则下次调用fgets()会遇到它,它会立即返回(有效地丢弃换行符)。
真正的问题在于fscanf()
和fgets()
如何相互交错以读取相同的文件,彼此交互(在这种情况下,因为它们处理新行的方式,以不必要的方式相互影响)。为避免此类交互,通常的准则是避免在同一文件句柄上混合输入样式,即不要将面向行的输入(例如fscanf()
)与格式化输入混合(例如fgets()
)和同一文件句柄上的面向字符的输入(例如fscanf()
)。
顺便说一句,如果您的代码保持原样,如果稍微更改输入文件(例如将两行合并为一行,添加空行等),您将会遇到更奇怪的行为。更多的数据将被丢弃,但丢弃的模式将更难以选择。