0

次のコードは、demo.txtに「テキスト」を書き込むことが期待されていますが、機能しません。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int fd;

    if ((fd = open("demo.txt", O_RDWR)) == -1) {
        perror("open");
        exit(1);
    }
    fp = fdopen(fd, "w");
    fprintf(fp, "some text\n");
    close(fd);
    return 0;
}
4

3 に答える 3

2

fflush(fp)ファイルを閉じる前に、バッファをクリアするために使用する必要があります。

ファイル記述子に書き込むとfp、データはバッファリングされます。ただしclose(fd)、バッファリングされたデータをファイルに書き込む前に、でファイルを閉じていますdemo.txt。したがって、バッファリングされたデータは失われます。実行fflush(fp)すると、バッファリングされたデータがすぐに demo.txt に書き込まれます。

開いているすべてのファイルに対してclose()実行する前に呼び出すべきではありません。fclose()

適切な方法は、fclose(fp)最初に実行してから実行することですclose(fd)

于 2012-10-31T11:34:05.830 に答える
2

に渡されるモード フラグfdopen()は、ファイル記述子のモードと互換性がある必要があります。ファイル記述子のモードは ですがO_RDWR、次のことを行っています:

fp = fdopen(fd, "w");

それはうまくいかないかもしれません (未定義の動作です)。代わりに、次の"r+"モードで開きます。

fp = fdopen(fd, "r+");

O_WRONLYまたは、ファイル記述子に使用します。

open("demo.txt", O_WRONLY)

fdopen()その後、モードにすることができ"w"ます。

最後にFILE、ファイル記述子を閉じる代わりに構造を閉じます。

fclose(fp);

そうしないと、fp基になるファイル記述子が失われます。その後、ファイル記述子を手動で閉じようとしてはいけません。fclose()それを独自に行います。

于 2012-10-31T11:40:31.210 に答える
1

close(fd) の代わりに fclose(fp) を使用する

于 2012-10-31T11:36:13.590 に答える