6

Windowsで、書き込みと読み取りを同時に行うためにファイルを開こうとしています。ファイルに(1秒ごとに)書き込むプログラムと、ファイルから読み取るプログラムが1つずつあります。UNIXでは完全に機能しますが、Windowsでは機能しません(すでに開いているファイルを開くことができません)。fopen()でファイルを開きます。

どうすればこの問題を解決できますか?

EDIT2:

_fsopenを使用していることを確認し、それFILE *に応じて共有フラグを設定します。

編集:

まず第一に、いくつかのコード:これは私がファイルを開くために使用した方法です

   FILE* f = NULL;
        int res = fopen_s(&f, "c:\\temp\\File1.txt", "w");
        if (res != 0) return;

        while (true) {
            Sleep(1000);
            fprintf_s(f , "Some data");
        }
        fclose(f); 

読み取りは他のアプリケーションで行われましたが、fscanf代わりに実行されました。

修正されたコード:

char d[] = "data";


HANDLE h = CreateFile("c:\\temp\\f.txt", GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS, /*FILE_ATTRIBUTE_NORMAL*/ FILE_FLAG_WRITE_THROUGH, NULL);

if (h == INVALID_HANDLE_VALUE) return 0;

DWORD bytesW;
while(true) {
    Sleep(100);
        WriteFile(h, d, strlen(d), &bytesW, NULL);
}

CloseHandle(h);
return 0; 
4

1 に答える 1

3

WindowsとLinuxの両方に、ファイルを開くデフォルトの方法があり、デフォルトでfopen使用されます。

Windowsでは、これはブロックを意味します(一度に1つのプロセスのみがファイルを開くことができます)。

Linuxでは、非ブロッキングを意味します。

fopen高レベルのAPIです。ファイルのブロックポリシーを自分で選択するには、Windowsの場合はWinAPIのOpenFileを使用する必要があります。特に、OF_SHARE_*フラグを見てください。

于 2013-02-07T17:26:21.710 に答える