为什么 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));
}
这个 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));
}