关于ftell()函数在文本模式下的返回值问题?
如下面的一段代码,以文本模式打开一个文件,文件内容就是下图:三个a加一个换行符,首先以fseek()函数定位到文件末尾并使用 ftell()函数文件字节数,再使用fread()读取文件,最后输出 ftell()和fread()的返回值,运行程序得出输出值:fread的返回值是4,ftell的返回值是5。这个程序是在windows下用vs运行的,也就是说这里的 ftell函数依旧把换行读取为“\r\n”并认为其是两个字节,但是以文本模式打开文件,C程序应该已经把“\r\n”看作“\n”把换行当作一个字节,但是为什么ftell依旧以二进制模式读取,而fread是正常的?这是系统问题还是函数本身的定义原因?亦或是编译器问题?
int main(void)
{
char* source;
char filename[40] = { 0 };
FILE* fp;
size_t file_size, read_size;
printf("input filename:");
scanf("%s", filename);
if ((fp = fopen(filename, "r")) == NULL)
{
fprintf(stderr, "open failed:%s", filename);
exit(EXIT_FAILURE);
}
fseek(fp, 0L, SEEK_END);
file_size = ftell(fp);
rewind(fp);
source = (char*)malloc(sizeof(char) * file_size);
read_size = fread(source, 1, file_size, fp);
fclose(fp);
printf("%zu ", read_size);
printf("%zu ", file_size);
return 0;
}