Getc过度阅读\ n字符

时间:2018-04-16 20:04:12

标签: c file-read getc


我对这个可以读取文件的小功能有一些问题:

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

它基本上是在阅读额外的&#34; \ n&#34;什么时候有一个。
为什么代码不起作用的任何想法?

由于

2 个答案:

答案 0 :(得分:2)

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

  

如果流在文本模式下打开,则仅支持的值   offset为零(适用于任何原点)和返回的值   早先在与同一文件关联的流上调用ftell   (仅适用于SEEK_SET的原点)。

但是,在for - 循环中,您传递的i值不会被ftell检索。

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

答案 1 :(得分:0)

以下提议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查错误
  4. 现在,建议的代码:

    #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);
    }