【问题标题】:fgets() didn't print the first linefgets() 没有打印第一行
【发布时间】:2015-02-22 19:26:27
【问题描述】:

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。
  • 整个while循环可以替换为while ( fscanf(file, "%f %f", &amp;num1, &amp;num2) == 2 ) { printf("%f\t%f\n", num1, num2); }
  • thnx thnx thnx 它在更改 while 循环后工作.. :)

标签: c fgets scanf


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    第一次通过循环,fgets()第一行接收到的数据被简单地丢弃了——所以第一行根本不会输出。

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

    真正的问题在于fgets() 和fscanf(),当它们相互交错以读取同一个文件时,如何相互交互(在这种情况下,因为它们以相互影响的方式处理换行符)不需要的方式)。为了避免这种交互,通常的指导方针是避免在同一文件句柄上混合输入样式,即不要将面向行的输入(例如fgets())与格式化输入(例如fscanf())或字符混合面向同一文件句柄的输入(例如fgetc())。

    顺便说一句,就目前的代码而言,如果您稍微更改输入文件(例如,将两行合并为一行,添加空行等),您将获得更奇怪的行为。更多数据将被丢弃,但丢弃的模式将更难挑选。

    【讨论】:

    • 谢谢你的时间。我改变了while循环和它的工作。thnk u guyz
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 2013-12-04
    • 1970-01-01
    相关资源
    最近更新 更多