Попытка чтения из файла с помощью файлового дескриптора выводит числа и косые черты на консоль

Я пытаюсь написать простую программу, которая читает файл с помощью таких функций, как 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

Я ожидал, что он напечатает некоторые значения из самого файла, а не цифры и косые черты, которые представляют то, что я не совсем понимаю.
Почему это происходит?

0

Решение

Следующие изменения заставят вашу программу работать:

  1. Ваш буфер должен быть существующим массивом символов, а ваш 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);
    
  2. Ваш заголовок функции должен принимать только указатель на символ в целях безопасности.

    int CacheFS_pread(int file_id, char* buf, size_t count, off_t offset)
    
  3. Ваш предварительный звонок тогда без адреса оператора &:

    pread(file_id, buf, count, seek);
    

Выход: nd third forth fift потому что буфер только 20!

Также я бы проверил, правильны ли ваши расчеты и ваши заявления if. У меня такое ощущение, что это не совсем правильно. Я также рекомендовал бы использовать возвращаемое значение pread.

1

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

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

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