Запись в файл с C ++ и Linux

Я должен реализовать буферный писатель с C ++ на Linux. Теперь у меня проблема: я могу записывать символы в файл, но, кроме того, файл заполнен недопустимыми символами (в gedit файл заполняется символом \ 00 после реальных символов).

Вот часть кода:

BufferedWriter::BufferedWriter(const char* path) {
pagesize = getpagesize();
if ((fd = open(path, O_WRONLY | O_DIRECT | O_CREAT | O_TRUNC, S_IRWXU))
== -1) {
perror("BufferedWriter: Error while opening file");
throw -1;
}
if (posix_memalign((void**) &buffer, pagesize, pagesize) != 0) {
perror("BufferedWriter: Error while allocating memory");
throw -3;
}
for (int i = 0; i < pagesize; i++) {
buffer[i] = 0;
}
charCnt = 0;
}

void BufferedWriter::writeChar(char c) {
buffer[charCnt] = c;
charCnt++;
if (charCnt == pagesize) {
if (write(fd, buffer, pagesize) == -1) {
perror("BufferedWriter: Error while writing to file");
throw -5;
}
for (int i = 0; i < pagesize; i++) {
buffer[i] = 0;
}
charCnt = 0;
}
}

Когда я инициализирую свой буфер, например с пробелами все работает нормально, но есть ли другой способ предотвратить «недопустимые символы»?

Спасибо за помощь

0

Решение

Потому что вы используете O_DIRECTВы, очевидно, вынуждены писать в pagesize приращения. Однако это означает, что ваш файл всегда будет дополнен несколькими pagesize, В вашем текущем коде он будет дополнен нулями, потому что вы обнуляете страницу каждый раз перед ее заполнением.

Одним из способов решения этой проблемы является отслеживание фактического объема данных, которые должны быть в файле, и ftruncate() файл до желаемого размера, прежде чем закрыть его.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]