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

在阅读了更多之后,我认为一个核心问题是 sprintf 中的 %d\n。

%d 写入可变数量的字节。例如,1\n 产生 2 个字节。315\n 产生 4。1024\n 产生 5。您的循环增量 (currentByte++) 假设每次写入四个字节。事实并非如此。

你可能想要这样的东西。

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 回答