Я пытаюсь написать простую программу, которая читает файл с помощью таких функций, как open
, lseek
, pread
,
Мой файл для теста содержит:
first second third forth fifth sixth
seventh eighth
моя основная функция, которая пытается прочитать 20 байтов со смещением 10 из файла:
#include <iostream>
#include "CacheFS.h"using namespace std;
int main(int argc, const char * argv[]) {
char * filename1 = "/Users/Desktop/File";
int fd1 = CacheFS_open(filename1);
//read from file and print it
void* buf[20];
CacheFS_pread(fd1, &buf, 20, 10);
cout << (char*)buf << endl;
}
Реализация функций, которые использует основное:
int CacheFS_open(const char *pathname)
{
mode_t modes = O_SYNC | 0 | O_RDONLY;
int fd = open(pathname, modes);
return fd;
}
int CacheFS_pread(int file_id, void *buf, size_t count, off_t offset)
{
off_t seek = lseek(file_id, offset, SEEK_SET);
off_t fileLength = lseek(file_id, 0, SEEK_END);
if (count + seek <= fileLength) //this case we are not getting to the file end when readin this chunk
{
pread(file_id, &buf, count, seek);
} else { //count is too big so we can only read a part of the chunk
off_t size = fileLength - seek;
pread(file_id, &buf, size, seek);
}
return 0;
}
Моя основная функция выводит это на консоль:
\350\366\277_\377
Я ожидал, что он напечатает некоторые значения из самого файла, а не цифры и косые черты, которые представляют то, что я не совсем понимаю.
Почему это происходит?
Следующие изменения заставят вашу программу работать:
Ваш буфер должен быть существующим массивом символов, а ваш CacheFS_pread
функция вызывается без оператора адреса &
затем. Также используйте buffer size minus 1
поскольку pread
функция переопределит завершение \0
потому что он просто читает n байтов файла. Я использую здесь инициализированный нулем массив символов, так что будет нулевое завершение \0
по крайней мере, в конце.
char buf[20] = { '\0' }; // declare and initialize with zeros
CacheFS_pread(fd1, buf, sizeof(buf) - 1, 10);
Ваш заголовок функции должен принимать только указатель на символ в целях безопасности.
int CacheFS_pread(int file_id, char* buf, size_t count, off_t offset)
Ваш предварительный звонок тогда без адреса оператора &
:
pread(file_id, buf, count, seek);
Выход: nd third forth fift
потому что буфер только 20!
Также я бы проверил, правильны ли ваши расчеты и ваши заявления if. У меня такое ощущение, что это не совсем правильно. Я также рекомендовал бы использовать возвращаемое значение pread.
Других решений пока нет …