アプリケーションが標準入力からの入力を読み取り、機能は以下の通りである:アプリケーションが処理している問題は
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 ....
Iがシステム上にこれを実行した入力を生成正しく、私は手動で作成されているのと同じ出力のためにこれを実行したとき、私はエラーメッセージ「取得しています」予期しないNL文字を読んで」。
$ convertInput <input.system> out
$
$ convertInput <input.manual> out
Unexpected NL character read
$
出力が正しい場合の両方。
2つの入力ファイルの差分をとったとき、次のようなメッセージが表示されました。
$ diff input.manual input.system
1c1
< INPUT
---
> INPUT
\ No newline at end of file
私はマニュアル入力ファイルを確認しましたが、入力後も改行はありません。私はfread自体をこれを修正するためにfgetsか何かに置き換えるべきかどうか分からない。
gdbは、 "fread"が "input.system"のINPUTの最後の後に "0"を返したことを示しました。ここで "fread"は "input.manual"のINPUTの終わりの後に "\ n"を返しました。
マニュアルファイルは、データの「vim入力」と「ペースト」として作成され、データの終わり(「\ n」を含む)とエディタの保存と終了後のすべての文字が削除されます。
これを修正するための提案や考えがありがとうございます。
ありがとう、
問題はありませんが、 'ftell'の後には戻り値と' errno'をチェックする必要はありません。戻り値で十分です。 'fread'の後に' feof'と 'ferror'を使ってEOFかエラーがあるかどうかを調べます。 –
「手動入力ファイルを確認しましたが、入力後に改行がありません」という意味はどうですか? diffは1つありますので、改行があることを確認したようです。 –
ファイルを開いたときに「改行」はありません。しかし、私が保存して終了してdiffを実行すると、diffは新しい行があることを示します。これがUnixのVimの機能であるかどうかは不明です。 –