應用從標準輸入讀取的輸入和功能如下:問題用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
我已驗證手動輸入文件,輸入後也沒有新行。我不確定fread本身是否應該用fgets或其他來解決這個問題。
gdb顯示「fread」在「input.system」的INPUT結尾後返回「0」,而「fread」在INPUT結束後爲「input.manual」返回「\ n」。
手動文件創建爲「vim輸入」並「粘貼」數據並刪除數據結束後的所有字符(包括「\ n」)和「保存並退出」編輯器。
任何建議或想法解決這個問題,表示讚賞。
謝謝,
與你的問題無關,但在'ftell'之後,你不需要檢查_both_返回值和'errno'。返回值就足夠了。在'fread'之後,使用'feof'和'ferror'來查看你是否有EOF或錯誤。 –
你是什麼意思「我已經驗證了手動輸入文件,輸入後也沒有新行」?差異似乎告訴你有一個,所以它看起來像你已經驗證,有一個換行符。 –
當我打開文件時,沒有「新行」。但是當我保存並退出並進行差異化時,差異顯示有一條新線。我不確定這是否是Unix中Vim的一個特性。 –