Getc 过度读取一个 \n 字符

Getc over-read a \n character


我在使用这个可以读取文件的小函数时遇到了一些问题:

void ReadFile(char *name) {
FILE *fr;
int lenght, i;
fr = fopen(name, "r");  //Open the file reader
fseek(fr, 0, 2);        //Set the pointer at the EOF
lenght = ftell(fr);     //Read the ending position
printf("\nDEBUG lenght:%d\n", lenght);
fseek(fr, 0, 0);        //Return at the beginning of the file

printf("File read:\n\n");
for (i = 1; i <= lenght; i++) {
    printf("%c", getc(fr));
    fseek(fr, i, 0);
}
fclose(fr);
}

这是它读取的文件:

qwerty

asdfgh
zxcvbn

但这是程序的输出:

DEBUG lenght:24
File read:

qwerty



asdfgh

zxcvbn

基本上就是在前面有一个"\n"的时候多读一个"\n"
关于为什么代码不起作用的任何想法?

谢谢

如果您以文本模式打开文件(像您一样),那么对 fseek 的调用可能只包含先前由 ftell 函数检索到的偏移值(参见,对于例如,cppreference/fseek):

If the stream is open in text mode, the only supported values for offset are zero (which works with any origin) and a value returned by an earlier call to ftell on a stream associated with the same file (which only works with origin of SEEK_SET).

但是,在您的 for 循环中,您传递的是 i 的值,ftell 未检索到该值。

除此之外,循环中的 fseek 是多余的,因为 fgetc 无论如何都会向前移动读取指针。所以 for (i = 1; i <= lenght; i++) { printf("%c", getc(fr)); } 应该完成这项工作。

以下建议代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查错误

现在,建议的代码:

#include <stdio.h>   // EOF, fopen(), getc(), putc() fclose() puts() perror()
#include <stdlib.h>  // exit(), EXIT_FAILURE

// prototype
void ReadFile(char *filename);


void ReadFile(char *filename)
{
    FILE *fp = fopen( filename, "r" );

    if( !fp )
    {
        perror( "fopen failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen successful

    puts("File read:\n");

    int ch;
    while( (ch = getc( fp )) != EOF )
    {
        putchar( ch );
    }

    fclose(fp);
}