2011-12-15 6 views
0

アプリケーションが標準入力からの入力を読み取り、機能は以下の通りである:アプリケーションが処理している問題は

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」を含む)とエディタの保存と終了後のすべての文字が削除されます。

これを修正するための提案や考えがありがとうございます。

ありがとう、

+0

問題はありませんが、 'ftell'の後には戻り値と' errno'をチェックする必要はありません。戻り値で十分です。 'fread'の後に' feof'と 'ferror'を使ってEOFかエラーがあるかどうかを調べます。 –

+0

「手動入力ファイルを確認しましたが、入力後に改行がありません」という意味はどうですか? diffは1つありますので、改行があることを確認したようです。 –

+0

ファイルを開いたときに「改行」はありません。しかし、私が保存して終了してdiffを実行すると、diffは新しい行があることを示します。これがUnixのVimの機能であるかどうかは不明です。 –

答えて

0

「手動」ファイルを作成する方法によって問題が異なります。テキストエディタ(vim)を使用している場合は、最後の "text"行を完成させる必要があるので、\ nを最後の場所に置くのが普通です。むしろバイナリエディタを使って仕事をしたいと思っています。私が知る限り、最近のvimのバージョンは "バイナリモード"を持っています。最後の\ nを失うファイルを作成する別の方法は、 "echo -en '... your data ...'>"ファイルを使用することです。 -nオプションは\ nを省略し、-eは "\"で始まる文字列を解釈します(例えば、 "\ n"、 "\ r" ...)。私はそれが助けることを望む。

ところで、stdinが実際のファイルにリダイレクトされないと、stdinの "ftell"は無駄な値を返すことがあります。

+1

':set binary 'と':set noeol'を使ってvimでこれを行うことができます。 –