0


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

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”。
关于为什么代码不起作用的任何想法?

谢谢

4

2 回答 2

2

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

如果流以文本模式打开,则唯一支持的 offset 值为零(适用于任何来源)和先前调用 ftell 对与同一文件关联的流的返回值(仅适用于 SEEK_SET 的来源)。

但是,在您的for-loop 中,您传递的是 的值i,而ftell.

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

于 2018-04-16T20:14:24.917 回答
0

以下建议的代码:

  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);
}
于 2018-04-17T05:30:44.157 回答