0

test.c

int main() {
    int fd = open("/test/aaa",O_RDONLY);
    char * str;
    int len;
    str = (char*)malloc(sizeof(char));
    len = read(fd,str,100);
    close(fd);
    printf("%s\n",str);
    free(str);
    str = NULL;
    return 0;
}

出力は次のようになります。

$echo 300 > /test/aaa
$gcc test.c -o test
$./test
300

$

ここに改行出力があるのはなぜですか? 乗りこなす安全な方法はありますか?または、 read() を間違った方法で使用しましたか? ありがとう!

4

6 に答える 6

4

ファイルに改行があるため、次のようにダンプすると表示されます。

od -xcb /test/aaa

それがファイルにある理由は、それをそこに置いたからです。 のデフォルトの動作は、echo与えられたものと改行文字を書き込むことです。

改行文字が必要ない場合は、次を使用します。

echo -n 300 >/test/aaa

さらにmalloc、単一の文字以外のものを保存するのに十分なスペースを割り当てていない場合は、次のことを試してください。

str = malloc (100);

また、戻り値をキャストしていないことにも気付くでしょう。これは、戻り値を他のポインターにmalloc暗黙的にキャストできる C の悪い習慣です。void *明示的にキャストすると、特定の微妙なエラーを隠すことができます。

また、Csizeof(char)では常に1 であるため、何を掛ける必要もありません。


正直なところ、行ベースのファイル入力が必要な場合はread、最初の選択肢ではありません。そのようなことを行うためのはるかに優れたオプションがありますfgets

于 2013-05-15T09:22:06.837 に答える
1

読み込んだファイルには、おそらく既に最後に改行があります。覚えておいてください、readあなたが言うだけ読んでください。

を使用するprintfと、別の改行を追加するように要求されます。

そのため、2 つの改行を取得しています。

編集:プログラムのいくつかの場所で未定義の動作も引き起こしています。

malloc1文字分のスペースを確保していますが、100バイトを格納しています。

さらにprintf、null バイトに遭遇するかクラッシュするまで文字を読み取ることを意味する文字列を null で終了していません。宇宙の終わりまで文字を読み続けることさえできます。

于 2013-05-15T09:20:21.993 に答える
1

コードに未定義の動作があります:

str = (char*)malloc(sizeof(char));

ここでは、1 バイトだけを割り当てます。次に、このメモリ領域に 100 バイトを読み続けます。また、割り当てられたメモリを文字列として扱いますが、文字列を適切に終了しないため、さらに別の未定義の動作状況が発生する可能性があります。readまた、またはmalloc呼び出しから発生する可能性のあるエラーをチェックすることさえしません。

ところで、 はsizeof(char) 常にであり1、 の戻り値をキャストするべきではありませんmalloc

于 2013-05-15T09:22:08.930 に答える
0
$echo -n 300 > /test/aaa

-n は改行を避けます

于 2013-05-15T09:23:55.067 に答える
0

デフォルトechoでは、行末に改行が追加されるためです。これが、ファイルが改行で終わる理由です。

を使用してこれを無効にすることができますecho -n 300 > /test/aaa

于 2013-05-15T09:20:52.483 に答える
0

それはあなたがそこに置いたからです:

printf("%s\n",str);

おそらく、代わりにこれを意味しました:

printf("%s",str);

これで、ファイルに含まれるもののみを取得できます。もちろん、ファイルには最後に独自の改行が含まれる場合があります。

于 2013-05-15T09:21:07.763 に答える