gpt4 book ai didi

c++ - 如何在 C++ 中使用 mmap 将整数数组正确写入文件

转载 作者:行者123 更新时间:2023-11-28 07:44:05 24 4
gpt4 key购买 nike

我目前正在尝试使用 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 的值?

最佳答案

进一步阅读后,我认为一个核心问题是 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 是源还是目标?

关于c++ - 如何在 C++ 中使用 mmap 将整数数组正确写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com