尝试使用文件描述符从文件读取打印数字和斜杠到控制台

时间:2017-05-31 10:55:35

标签: c++ io lseek

我正在尝试编写一个简单的程序,通过封装openlseekpread等函数来读取文件。

我的测试文件包含:

first second third forth fifth sixth
seventh eighth

我的主函数尝试从文件中读取带有偏移量10的20个字节:

#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

我希望它能从文件本身打印一些值,而不是某些数字和斜线代表我不太懂的东西。 为什么会这样?

1 个答案:

答案 0 :(得分:1)

以下更改将使您的计划有效:

  1. 您的缓冲区必须是一个现有的char数组,然后在没有地址运算符CacheFS_pread的情况下调用&函数。还要使用buffer size minus 1,因为pread函数将覆盖终止\0,因为它只读取文件的n个字节。我在这里使用零初始化的char数组,以便至少在结尾处有一个null终止\0

    char buf[20] = { '\0' }; // declare and initialize with zeros
    CacheFS_pread(fd1, buf, sizeof(buf) - 1, 10);
    
  2. 由于类型安全原因,您的函数标题应仅接受char指针。

    int CacheFS_pread(int file_id, char* buf, size_t count, off_t offset)
    
  3. 您的pread调用没有地址运算符&

    pread(file_id, buf, count, seek);
    
  4. 输出:nd third forth fift因为缓冲区只有20!

    另外,我会检查你的计算和你的if语句是否正确。我觉得这不完全正确。我还建议使用pread的返回值。