如何解决为什么 fopen 在将读取调用 char * 的输出传递给 fopen 的第一个参数时给出“没有这样的文件或目录”错误
此 while 循环在服务器程序中,读取调用通过 connfd 链接到客户端,该调用将 buff 作为文件的名称通过 get 从用户处获取并通过写入调用传递。 如果我将“filename.txt”粘贴到 fopen 的第一个参数中,它会起作用,但是这个 buff 作为参数会导致 fopen 报告错误为“没有这样的文件或目录”。 :(任何帮助appriciated
while(read(connfd,buff,sizeof(buff))){
write(1,sizeof(buff));
if((fp = fopen(buff,"r")) == NULL){
perror("File Open error");
write(connfd,"File Open error! File not found",sizeof("File Open error! File not found"));
}else{
send_file(fp,connfd);
printf("\nFile sent Successfully! in server_helper");
}
bzero(buff,sizeof(buff));
}
解决方法
read(connfd,buff,sizeof(buff))
假设 read
返回一个正值,而 buff
是一个静态字符数组 (char buff[N]
),那么您有一个填充了一些数据但不是以空字符结尾的字符数组细绳。为了将 buff
传递给 fopen
,您必须在缓冲区 '\0'
中的数据末尾附加一个 buff
。
为此你需要读取的结果
ssize_t bytes_read = read(connfd,sizeof(buff) - 1); //1 byte for '\0'
buff[bytes_read] = '\0'; //if bytes_read >= 0
之后,如果您需要字符串/数据的长度,则必须使用strlen(buff)
。由于缓冲区中的字符数可能少于缓冲区大小 (sizeof(buff) != strlen(buff)
)。
我明白了,谢谢@Erdal Küçük 我使用了 strlen,因为 sizeof 提供了完整的增益,我只需要有数据的部分,而不是全部
while(read(connfd,sizeof(buff) - 1)){
int len = strlen(buff);
printf("%d",len);
buff[strlen(buff) - 1] = '\0';
write(1,sizeof(buff));
if((fp = fopen(buff,"r")) == NULL){
perror("File Open error");
write(connfd,"File Open error! File not found",sizeof("File Open error! File not found"));
}else{
send_file(fp,connfd);
printf("\nFile sent Successfully! in server_helper");
}
bzero(buff,sizeof(buff));
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。