我对这个可以读取文件的小功能有一些问题:
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;什么时候有一个。
为什么代码不起作用的任何想法?
由于
答案 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)
以下提议的代码:
现在,建议的代码:
#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);
}