gpt4 book ai didi

c - 如何在c中正确地错误捕获读取以从文件描述符中获取字节数

转载 作者:行者123 更新时间:2023-11-30 15:12:39 24 4
gpt4 key购买 nike

我目前正在编写一个小虚拟程序,以尝试掌握正确使用 c 中的读取的技巧。我创建了一个名为 readdata 的小函数,用于从文件描述符中读取数据并将其存储在缓冲区中,然后返回读取的字节数。我的问题是我试图正确地处理错误并捕获一些东西,这样就不会有缓冲区溢出,但我继续做一些事情。

这是测试仪:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define BUFSIZE 10

int readdata(int fd, char *buf, int bsize);

int main(void) {
char buf[BUFSIZE];
int returnval;
int length;
returnval = readdata(STDIN_FILENO, buf, BUFSIZE);
printf("%s",buf);
length = strlen(buf);
fprintf(stderr,"The return value is %d\n", returnval);
fprintf(stderr,"The string is %s\n",buf);
fprintf(stderr,"The length of the string is %d\n",length);
return 0;
}

这是一个小函数:

#include <stdio.h>
#include <stdlib.h>

int readdata(int fd, char *buf, int bufsize){
int n = 0;
if(fd < 0){
return 1;
}

while((n=read(fd,buf,(bufsize-1)))>0){
if(n == -1) {
perror( "Read failed" );
return 1;
}
else{
buf[bufsize] = 0;
return n;
}
}
}

如果我运行

 cc -o test test.c readdata.c

然后放入

echo "Hello" | ./test

效果很好。但是如果我像这样通过 bufsize 限制:

echo "1234567891" | ./getdatatest

它给了我这个奇怪的输出,其中显示“字符串是 123456789[一些奇怪的符号]”。所以我不确定在哪里处理这个错误或者为什么它在读取时仍然错误地放入缓冲区。

最佳答案

您确实知道 read() 返回的字符数少于您请求的字符数吗?另外,buf[bufsize] 刚好超过 buf 的末尾。您的 readdata 函数还应该在错误时返回类似 -1 的内容,而不是 1,这样您就可以区分条件“one byte read”和“IO错误。”

考虑这样的事情:

for (;;) {
n = read(fd, buf, (bufsize - 1));

if(n == -1) {
perror( "Read failed" );
return -1;
} else {
buf[n] = 0;
return n;
}
}

关于c - 如何在c中正确地错误捕获读取以从文件描述符中获取字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34967197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com