Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从标准DIN读取系统生成和手动输入时,fread出现问题_C_Stdin_Fread - Fatal编程技术网

C 从标准DIN读取系统生成和手动输入时,fread出现问题

C 从标准DIN读取系统生成和手动输入时,fread出现问题,c,stdin,fread,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')

应用程序从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 ....
filepos=ftell(标准输入法);
if(filepos<0&&errno!=0)
{
佩罗(“ftell”);
返回1;
}
如果((n=fread(输入_数据,sizeof(char),2,stdin))!=2)
{
如果(n==1)
{
如果(*输入数据=='\n')
fprintf(stderr,“意外的NL字符读取\n”);
如果(*input_data=='\r'),则为else
fprintf(stderr,“意外的CR字符读取\n”);
其他的
fprintf(stderr,“意外字符读取”、*输入数据);
}
else如果(n!=0&&errno!=0)
{
佩罗(“fread”);
}
返回1;
}
... 过程数据。。。。
当我对应用程序正在正确处理的系统生成的输入运行此命令时,当我对手动创建的相同输出运行此命令时,我收到错误消息“意外NL字符读取”

$convertInputout
$
$convertInputout
意外的NL字符读取
$
在这两种情况下,输出都是正确的

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

$ diff input.manual input.system
1c1
< INPUT
---
> INPUT
\ No newline at end of file
$diff input.manual input.system
1c1
<输入
---
>输入
\文件末尾没有换行符
我已经验证了手动输入文件,输入后也没有新行。我不确定fread本身是否应该替换为fgets或其他修复方法

gdb显示“INPUT.system”的“fread”在输入结束后返回“0”,其中“fread”在“INPUT.manual”的输入结束后返回“\n”

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

如果您有任何建议或想法来解决此问题,我们将不胜感激


谢谢,

问题取决于您创建“手动”文件的方式。如果您使用文本编辑器(vim),它在最后一个位置放置一个\n是正常的,因为它必须完成最后一行“文本”。我宁愿使用二进制编辑器来完成这项工作。据我所知,最近的vim版本具有“二进制模式”“。创建未命中最后一个文件的另一种方法是使用“echo-en”…您的数据…'>file”。-n选项省略了\n,-e选项解释以“\”开头的字符序列(例如“\n”、“\r”…)。我希望这能有所帮助


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

与您的问题无关,但在
ftell
之后,您不需要同时检查返回值和
errno
。返回值足够了。在
fread
之后,使用
feof
ferror
查看是否存在EOF或错误。您所说的“我已经验证了手动输入文件,输入后也没有新行”是什么意思?diff似乎在告诉你有一行,所以看起来你已经验证了是否有新行。当我打开文件时,没有“新行”。但是,当我保存并退出并进行差异时,差异显示有一个新行。我不确定这是否是Unix中Vim的一项功能。您可以使用
:set binary
:set noeol
在Vim中执行此操作。
$ diff input.manual input.system
1c1
< INPUT
---
> INPUT
\ No newline at end of file