应用程序从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”)和“保存并退出”编辑器。
有任何建议或想法可以解决这个问题。
谢谢,
答案 0 :(得分:0)
问题取决于您创建“手动”文件的方式。如果你使用文本编辑器(vim),它会将\ n放在最后一个位置,这是正常的,因为它必须完成最后一个“文本”行。我宁愿使用二进制编辑器来完成这项工作。据我记忆,最近的vim版本有一个“二进制模式”。另一种创建错过最后一个文件的方法是使用“echo -en'...您的数据......'&gt;文件”。 -n选项省略\ n,-e one解释以“\”开头的字符序列(例如“\ n”,“\ r”...)。我希望它可以提供帮助。
顺便说一句,如果stdin没有重定向到真实文件,stdin上的“ftell”可能会返回无用的值。