从stdin读取系统生成和手动输入时出现fread问题

时间:2011-12-15 07:17:37

标签: c stdin fread

应用程序从stdin读取输入,函数如下:

filepos = ftell(stdin);
if (filepos < 0 && errno != 0)
{
    perror("ftell");
    return 1;
}
if ((n = fread(input_data, sizeof(char), 2, stdin)) != 2)
{
    if (n == 1)
    {
        if (*input_data == '\n')
            fprintf(stderr, "Unexpected NL character read\n");
        else if (*input_data== '\r')
            fprintf(stderr, "Unexpected CR character read\n");
        else
            fprintf(stderr, "Unexpected character read <%c>\n", *input_data);
    }
    else if (n != 0 && errno != 0)
    {
        perror("fread");
    }
    return 1;
}
    ... process data ....

当我在系统生成的输入上运行它时,应用程序正在正确处理,当我为手动创建的相同输出运行它时,我收到错误消息“”意外的NL字符读取“。

$ convertInput < input.system > out
$
$ convertInput < input.manual > out
Unexpected NL character read
$

两种情况都是输出正确。

当我在两个输入文件之间进行差异时,它显示如下信息。

$ diff input.manual input.system
1c1
< INPUT
---
> INPUT
\ No newline at end of file

我已经验证了手动输入文件,输入后也没有换行。我不确定是否应该用fgets替换fread本身来解决这个问题。

gdb显示“输入系统”的INPUT结束后“fread”返回“0”,其中“fread”在“input.manual”的INPUT结束后返回“\ n”。< / p>

手动文件创建为“vim input”并“粘贴”数据,并在数据结束后删除所有字符(包括“\ n”)和“保存并退出”编辑器。

有任何建议或想法可以解决这个问题。

谢谢,

1 个答案:

答案 0 :(得分:0)

问题取决于您创建“手动”文件的方式。如果你使用文本编辑器(vim),它会将\ n放在最后一个位置,这是正常的,因为它必须完成最后一个“文本”行。我宁愿使用二进制编辑器来完成这项工作。据我记忆,最近的vim版本有一个“二进制模式”。另一种创建错过最后一个文件的方法是使用“echo -en'...您的数据......'&gt;文件”。 -n选项省略\ n,-e one解释以“\”开头的字符序列(例如“\ n”,“\ r”...)。我希望它可以提供帮助。

顺便说一句,如果stdin没有重定向到真实文件,stdin上的“ftell”可能会返回无用的值。