我联系你是因为我的程序有问题。为了我的学习,我目前正在用C编写一个函数来读取文件,我只被允许使用以下函数/系统调用:* * malloc、释放、退出、(f)打开、(f)关闭、(f)读取、(f)写入、获取行、ioctl、usleep、sigaction、信号、状态、lstat、fstat**
问题是,当调用我的函数my_filetostr()时,它在read()系统调用处阻塞了程序,什么也没发生。
下面是我代码:
char *my_filetostr(const char *filepath)
{
int fd = 0;
struct stat s;
char *buff = NULL;
if (fd = open(filepath, O_RDONLY) > 0) {
stat(filepath, &s);
buff = malloc(sizeof(char) * s.st_size + 1);
my_printf("fd : %d, size : %d\n", fd, s.st_size);
if (read(fd, buff, s.st_size) == s.st_size) {
buff[s.st_size] = '\0';
}
close(fd);
}
return buff;
}
我指定我的文件存在(我的错误处理工作)。
我试着放一些my_printf(我们不得不重新编码printf)来查看程序停止的位置并显示一些有用的信息:
- 所以我知道问题出在read()
- st_size返回正确的大小,并且filedescriptor具有正确的值。
这个项目应该继续下去。
2条答案
按热度按时间xxe27gdn1#
您在
if
条件内为fd赋值。这通常会导致错误和should be avoided
这里的问题是因为
>
与=
相比具有higher precedence,所以fd
变为1,即标准输出。我已经修改了您的代码以突出显示https://godbolt.org/z/M4PbcPfev问题
fd:1,尺寸:140728905723182
plicqrtu2#
感谢您@斯塔克,@用户3840170,@特哈斯
我的代码现在可以工作了:
我已执行以下操作:
int fd = 0
替换为int fd = -1
fd = open(filepath, O_RDONLY) > 0
部件(fd = open(filepath, O_RDONLY)) != -1
谢谢你的回答。