错误的文件描述符 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 * 会以某种方式产生一个字符串是一个疯狂的假设。

不要这样做。