c - feof 过早变为真

标签 c fgets feof

我正在尝试通过套接字发送文件,方法是一次读取一个字符,直到缓冲区(字符数组)已满,发送它,然后重复直到文件末尾。但出于某种原因,feof 在文件结束前变为真(我相信可能是在缓冲区数组已满时)。

int c;
int end_loop = 1;
char to_send[BUFFER_LENGTH];
while (end_loop == 1) { //For the entire file
    printf("creating next data\n");
    bzero(to_send, BUFFER_LENGTH);
    for (int i = 0; i < BUFFER_LENGTH - 1; i++) { // read data from file until buffer full or EOF
        c = fgetc(f);
        if (c == EOF) { // If end of file break loop
            printf("EOF\n");
            end_loop = 0;
            break;
        }
        to_send[i] = c;
    }
    for (int i = 0; i < strlen(to_send); i++) {
        printf("%c", to_send[i]);
    }
    n = write(sockfd, to_send, strlen(to_send));
    if (n < 0) {
        perror("ERROR writing to socket");
        exit(1);
    }
}
n = write(sockfd, "EOF", 3);
if (n < 0) {
    perror("ERROR writing to socket\n");
    exit(1);
}

这是一个简单文件的输出 client output

feof 可能不是问题,因为尽管遇到“EOF”,代码似乎仍在循环。

编辑:添加评论中的建议。错误依旧。

最佳答案

代码需要跟踪读取了多少个字符然后 printf(), write()这么多字符。

while (end_loop == 1) {
    ...
    // for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
    int i;
    for (i = 0; i < BUFFER_LENGTH - 1; i++) { 
      ...
    }
    // for (int i = 0; i < BUFFER_LENGTH - 1; i++) {
    //    printf("%c", to_send[j]);
    for (int j = 0; j < i; j++) {
      ...
    // n = write(sockfd, to_send, BUFFER_LENGTH);
    n = write(sockfd, to_send, i);
    ...
}

其他问题包括

测试EOF ,不仅feof(f)

    c = fgetc(f);
    // if (feof(f)) { // If end of file break loop 
    if (c == EOF) { // If end of file break loop **or input error**

填充 char 时不需要 -1大批。 -1 可能对字符串有用,但在这里使用字符串也不是最好的主意,因为 fgetc()可能会返回一个空字符

//                                   vvv 
// for (int i = 0; i < BUFFER_LENGTH - 1; i++)
for (int i = 0; i < BUFFER_LENGTH; i++)
// or better 
size_t i; 
for (i = 0; i < sizeof to_send; i++)

OP 修改了代码中间答案 Hmmmmmmmm。

不要使用 for (int i = 0; i < strlen(to_send); i++) { .读取的数据可能包含空字符,这会影响此处字符串 的良好使用。


如果OP不想看到"EOF\n"在最后一行之前,打印 "EOF\n"while之后循环。

关于c - feof 过早变为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058590/

相关文章:

c - snprintf - 格式化不是字符串文字并且没有格式参数警告

c - 这段代码有什么问题?

c - 什么会导致 fgets() 不断等待输入?

c - 使用 fgets 读取字符串,无法获取第二个字符串的输出

c - 为什么最后一次迭代重复?

c - 即使在进入主程序之前,复位中断 vector SYSRSTIV 也被设置为 001Eh(外设/配置区域获取 - PERF)

c - 尝试了解 .h 文件或其 .c 实现文件中声明结构之间的差异

c - fgets 为 popen 返回的 FILE 返回错误

c - 为什么“while(!feof(file))”总是错误的?

c - 使用 fscanf() 从文件中读取文本