错误的文件描述符 fgets
Bad file descriptor fgets
我正在尝试创建一个文件来将信息发送到另一个进程。但是当我到达 send_file 函数时,我得到 -->fgets():: 错误的文件描述符。有人可以帮我解决这个问题吗?我卡住了。
#include <stdlib.h>
#include <stdio.h>
void send_file(FILE *fp, int sockfd){
char data[SIZE] = {0};
if (fgets(data, SIZE, fp) == NULL){
perror("\n -->Error in fgets():");
}
while (fgets(data, SIZE, fp) != NULL){
if (send(sockfd, data, sizeof(data), 0) == -1){
perror("\n -->Error in send():");
exit(-1);
}
bzero(data, SIZE);
}
}
int main(int argc, char *argv[]){
int clientfd, r;
...
char buffer[SIZE];
clientfd = socket(AF_INET, SOCK_STREAM, 0);
...
char *filenames = "file3.txt";
FILE *fp = fopen(filenames, "w");
if (fp == NULL){
perror("\n -->Error creating file:");
exit(-1);
}
char buff[30] = "This is a test text";
fwrite(buff , 1 , sizeof(buff) , fp);
printf("Contents: %s\n", (char *)fp);
send_file(fp, clientfd);
printf("Sent successfully.\n");
fclose(fp);
close(clientfd);
return 0;
}
FILE *fp = fopen(filenames, "w");
以 write-only 模式打开文件。
使用read-write模式,如"r+"
、"w+"
或"a+"
,fseek
将文件适当地移动到正确的位置后放置任何你想要的数据。
有关每种文件访问模式的语义,请参阅 fopen
。
或者,可以说是一个更好的主意:写入文件后关闭文件,然后以 read-only 模式重新打开它。
使用 fgets
初始检查 EOF 或错误的模式存在缺陷。如果成功,您将丢失最多前 sizeof data - 1
个字节的信息,因为缓冲区在下一个 fgets
调用之前未被使用,这将覆盖它或失败。
printf("Contents: %s\n", (char *)fp);
将 FILE *
转换为 char *
会以某种方式产生一个字符串是一个疯狂的假设。
不要这样做。
我正在尝试创建一个文件来将信息发送到另一个进程。但是当我到达 send_file 函数时,我得到 -->fgets():: 错误的文件描述符。有人可以帮我解决这个问题吗?我卡住了。
#include <stdlib.h>
#include <stdio.h>
void send_file(FILE *fp, int sockfd){
char data[SIZE] = {0};
if (fgets(data, SIZE, fp) == NULL){
perror("\n -->Error in fgets():");
}
while (fgets(data, SIZE, fp) != NULL){
if (send(sockfd, data, sizeof(data), 0) == -1){
perror("\n -->Error in send():");
exit(-1);
}
bzero(data, SIZE);
}
}
int main(int argc, char *argv[]){
int clientfd, r;
...
char buffer[SIZE];
clientfd = socket(AF_INET, SOCK_STREAM, 0);
...
char *filenames = "file3.txt";
FILE *fp = fopen(filenames, "w");
if (fp == NULL){
perror("\n -->Error creating file:");
exit(-1);
}
char buff[30] = "This is a test text";
fwrite(buff , 1 , sizeof(buff) , fp);
printf("Contents: %s\n", (char *)fp);
send_file(fp, clientfd);
printf("Sent successfully.\n");
fclose(fp);
close(clientfd);
return 0;
}
FILE *fp = fopen(filenames, "w");
以 write-only 模式打开文件。
使用read-write模式,如"r+"
、"w+"
或"a+"
,fseek
将文件适当地移动到正确的位置后放置任何你想要的数据。
有关每种文件访问模式的语义,请参阅 fopen
。
或者,可以说是一个更好的主意:写入文件后关闭文件,然后以 read-only 模式重新打开它。
使用 fgets
初始检查 EOF 或错误的模式存在缺陷。如果成功,您将丢失最多前 sizeof data - 1
个字节的信息,因为缓冲区在下一个 fgets
调用之前未被使用,这将覆盖它或失败。
printf("Contents: %s\n", (char *)fp);
将 FILE *
转换为 char *
会以某种方式产生一个字符串是一个疯狂的假设。
不要这样做。