如何在C中读取带有read()函数的大文件

时间:2017-01-25 19:01:40

标签: c file-io

阿罗哈,

我是新来的,所以请放轻松我。 我正在尝试将函数read()然后write()的文件读取到文件或文件描述符。我的函数成功读取了一个文件,但是当我尝试读取一个更大的文件时出现问题(我的示例大小为40,000字节)。

我认为我必须编写一个while循环,它将一直读到文件结尾,但我仍然坚持如何使用..

(我在程序的主程序中打开一个文件或文件描述符)

我的函数(也转换二进制输入字符数据并写入ASCII):

void function(int readFrom,int writeOn){
    char buffer[100];
    int x = read(readFrom, buffer, sizeof(buffer));
    int size= x/8;
    int i;
    for(i=0; i<size; i++){
        char temp[sizeof(int)-1];
        sprintf(temp,"%d",buffer[i];
        write(writeOn, temp, sizeof(temp));
    }
}

2 个答案:

答案 0 :(得分:2)

您需要检查函数readwrite的返回值。它们返回读/写的字节数,可能小于作为第三个参数传递的数字。 readwrite都必须在以下循环中完成:

int bytesRead = 0;

while (bytesRead < sizeof(buffer)) {
    int ret = read(readFrom, buffer + bytesRead, sizeof(buffer) - bytesRead);

    if (ret == 0)
        break; / * EOF */

    if (ret == -1) {
        /* Handle error */
    }

    bytesRead += ret;
}

答案 1 :(得分:2)

您使用buffertemp中的字符转换为非常小的缓冲区int。在大多数当前系统上,char为4个字节,因此printf会导致99值大于'c'(ASCII字母char)的缓冲区溢出。请注意,-99可以默认签名,因此小于x/8的负值将需要5个字节用于字符串转换:3位数,减号和空终止符。

你应该让这个缓冲区更大。

此外,我不明白为什么你只处理read()函数读取的缓冲区中的{{1}}个字节。你的功能的目的是模糊的。