0

現在、mmap を使用して配列から .txt ファイルに整数を書き込もうとしています。しかし、私はそれを解決できなかったという予期しない問題に直面しています。まず、整数の配列をファイルに書き込もうとしているコードを次に示します。

bool writeFileFromArrayByMemoryMap( int *&arrayToWriteInto, int size, char *output_file_name){ 
    int sizeForOutputFile = size * sizeof(int);
    int openedFile = open(output_file_name, O_RDWR | O_CREAT); //openning the file with the read&write permission
    lseek (openedFile, sizeForOutputFile-1, SEEK_SET);
    write (openedFile, "", 1);

    int *memoryBuffer = (int *)mmap(NULL, sizeForOutputFile, PROT_READ | PROT_WRITE, MAP_SHARED, openedFile, 0); //creating a memory mapping

    int currentIndex = 0; //the current index to put currentIntegerToPutArray to the array
    int *currentByte = memoryBuffer;
    while(currentIndex < size) {

        sprintf((char *)currentByte, "%d\n", arrayToWriteInto[currentIndex]);
        currentByte++;
        currentIndex++;
    }
    close(openedFile); //closing the file
    munmap(memoryBuffer, sizeForOutputFile); //remove the maping*/
return true;}

配列とファイルのパスは呼び出し元から渡され、サイズは今のところ 100 です。実際に書き込みたいファイル サイズは 100*sizeof(int) よりもはるかに大きいですが、書き込みをテストするために小さくしました。それにもかかわらず、私は整数を正しく書くことができません。出力ファイルはいくつかの結果を適切に書き込みますが、しばらくすると新しい行に入らず、新しい行で区切らずにすべての整数を書き込みます。それを行う理由はどこにあるのでしょうか?私が見る限り、ファイルのサイズを適切に設定していますが、ファイルのバイトを間違って使用している可能性が高いようです。

編集:また、プログラムが 999 より大きい値を書き込もうとすると、おかしくなることもわかりました。配列が 1000 未満の値でいっぱいの場合は、正しく書き込んでも問題ありません。999 より大きい値を正しく書き込めないのはなぜですか?

4

1 に答える 1

1

これをさらに読んだ後、中心的な問題の 1 つは sprintf の %d\n だと思います。

%d は可変バイト数を書き込みます。たとえば、1\n は 2 バイトを生成します。315\n は 4 を生成します。1024\n は 5 を生成します。ループのインクリメント (currentByte++) は、毎回 4 バイトが書き込まれることを前提としています。そうではありません。

あなたはこのようなものが欲しいかもしれません。

char *pc = (char*)memoryBuffer
for(int i=0;i<size;++i) {
    pc+=sprintf(pc, "%d\n", arrayToWriteInto[i]);
}

ただし、変数の名前 arrayToWriteInto は非常に誤解を招くものです。コードはそこから読み取るだけのようです。arrayToWriteInto はソースまたは宛先ですか?

于 2013-03-04T23:59:53.447 に答える