繁体   English   中英

fgets()没有打印第一行

[英]fgets() didn't print the first line

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

我不知道第一行是我的问题。 请帮我解决这个问题。

你的fgets将第一行读入line ,你永远不会使用它。 然后使用fscanf直接从文件(而不是从line )读取数字。 fgets的进一步调用基本上消耗了文件中的换行符。 尝试将fscanf切换为sscanf并从line而不是file读取,或者完全去除fgets并根据fscanf的返回值退出循环。

根据定义, fgets()不会打印任何内容。 它只读取输入。

无论如何,你的问题是 - 每次通过while循环时,动作是一次调用fgets()while循环条件),然后调用两次fscanf() 仅输出使用fscanf()读取的结果。

第一次通过循环时,第一行fgets()接收的数据被简单地丢弃 - 因此第一行根本不会输出。

在后续迭代中,没有跳过输出的唯一原因是你很幸运。 fscanf() - 使用您的格式字符串 - 在遇到空格字符时停止读取,但是等待从文件中读取该字符。 如果这是换行符,则下次调用fgets()会遇到它,它将立即返回(有效地丢弃换行符)。

真正的问题在于fgets()fscanf()当它们彼此交错以读取相同的文件时,如何相互交互(在这种情况下,因为它们以不希望的方式处理相互影响的方式) 。 为避免此类交互,通常的准则是避免在同一文件句柄上混合输入样式,即不要将面向行的输入(例如fgets() )与格式化输入(例如fscanf() )混合,也不要与字符混合相同文件句柄上的定向输入(例如fgetc() )。

顺便说一句,如果您的代码保持原样,如果稍微更改输入文件(例如将两行合并为一行,添加空行等),您将会遇到更奇怪的行为。 将丢弃更多数据,但丢弃的模式将更难以选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM