为什么 fopen 在将读取调用 ( char * ) 的输出传递给 fopen 的第一个参数时给出 "No such file or directory" 错误

Why fopen gives "No such file or directory" error on passing output of read call ( char * ) to fopen's first parameter

这个 while 循环在服务器程序中,read 调用通过 connfd 链接到客户端,connfd 传递 buff 作为通过 gets 从用户获取的文件名,并通过 write 调用传递。 如果我在 fopen 第一个参数中粘贴“filename.txt”,它可以工作,但是这个 buff 作为参数会导致 fopen 报告错误为“没有这样的文件或目录”。 :( 任何帮助都适用

while(read(connfd, buff, sizeof(buff))){
            write(1, buff, 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 returns 是一个正值并且 buff 是一个静态字符数组 (char buff[N]),那么您有一个填充了一些数据的字符数组但不是以 null 结尾的字符串。为了将 buff 传递给 fopen,您必须在缓冲区 buff.

中的数据末尾附加一个 '[=17=]'

为此你需要读取的结果

ssize_t bytes_read = read(connfd, buff, sizeof(buff) - 1); //1 byte for '[=11=]'
buff[bytes_read] = '[=11=]'; //if bytes_read >= 0

之后,如果你需要string/data的长度,那么你必须使用strlen(buff)。由于缓冲区中的字符数可能少于缓冲区大小 (sizeof(buff) != strlen(buff))。

我明白了,谢谢@Erdal Küçük 我使用了 strlen,因为 sizeof 提供了完整的增益,我只需要有数据的部分而不是全部

while(read(connfd, buff, sizeof(buff) - 1)){   
            int len = strlen(buff);
            printf("%d",len);
            buff[strlen(buff) - 1] = '[=10=]';
            write(1, buff, 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));
        }