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)); }
应该完成这项工作。
以下建议代码:
- 干净地编译
- 执行所需的功能
- 正确检查错误
现在,建议的代码:
#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);
}
我在使用这个可以读取文件的小函数时遇到了一些问题:
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)); }
应该完成这项工作。
以下建议代码:
- 干净地编译
- 执行所需的功能
- 正确检查错误
现在,建议的代码:
#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);
}