【问题标题】:How to read a large file with function read() in C如何在 C 中使用函数 read() 读取大文件
【发布时间】:2017-01-25 19:01:40
【问题描述】:

阿罗哈,

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

我认为我必须编写一个 while 循环,该循环将一直读取到文件末尾,但我一直坚持如何......

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

我的函数(也转换二进制输入字符数据并写入 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));
    }
}

【问题讨论】:

  • size(int)-1 并不是一个真正的大缓冲区。
  • 显示 40k 读取的“示例”。
  • 此语句:int size= x/8; 使用整数数学,因此如果读取的字节数不是 8 的倍数,则某些字节将永远不会被处理。由于 100 不是 8 的倍数,因此每次通过外循环时,您可能会错过输出 4 个字节。此外,当read() 未能输入 100 个字节时,每次通过外循环时,预计执行最多会丢失 7 个字节。读取 1024 字节并使用来自 read() 的返回值作为调用 write() 的计数要好得多
  • @reny310:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c file-io


【解决方案1】:

您需要检查函数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;
}

【讨论】:

  • 如果在填充缓冲区之前达到 EOF,就会陷入无限循环。
【解决方案2】:

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

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

此外,我不明白为什么您只处理 read() 函数读取的缓冲区中的 x/8 字节。你的函数的目的是模糊的。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多