阿罗哈,
我是新来的,所以请放轻松我。
我正在尝试将函数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));
}
}
答案 0 :(得分:2)
您需要检查函数read
和write
的返回值。它们返回读/写的字节数,可能小于作为第三个参数传递的数字。 read
和write
都必须在以下循环中完成:
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)
您使用buffer
将temp
中的字符转换为非常小的缓冲区int
。在大多数当前系统上,char
为4个字节,因此printf会导致99
值大于'c'
(ASCII字母char
)的缓冲区溢出。请注意,-99
可以默认签名,因此小于x/8
的负值将需要5个字节用于字符串转换:3位数,减号和空终止符。
你应该让这个缓冲区更大。
此外,我不明白为什么你只处理read()
函数读取的缓冲区中的{{1}}个字节。你的功能的目的是模糊的。