В настоящее время я пытаюсь записать целые числа из массива в файл .txt с помощью mmap. Однако я столкнулся с неожиданной проблемой, которую не смог решить. Прежде всего, вот код, в котором я пытаюсь записать массив целых чисел в файл.
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?
Прочитав это подробнее, я думаю, что одной из основных проблем является% d \ n в sprintf.
% 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 источником или местом назначения?
Других решений пока нет …