文件读取的文件结束符

C语言 码拜 9年前 (2015-05-11) 832次浏览 0个评论
 

我有一段程序为什么在windows下 和 linux下运行的结果不一样?
第一个不同点是 cnt的值不一样。
第二个不同点输出不一样。
我的文件是abc.txt 里面手敲了abcde 没有敲换行符
我知道windows下和linux下对于换行符的处理不一样,可是我的文本文件里根本没有打换行符。

在windows下运行 结果是
5
edcba
在linux下运行 结果是
6

edcba
对于第一个结果 我不太懂windows的结果 因为 文件虽然有5个字符 但是还有一个文件结束符 所以最后应该是6个字符
对于第二个结果 我不懂linux的结果 就算要输出文件结束符 为什么会输出一个换行
还有一点SEEK_END到底是停在最后一个有效字符的结尾 还是最后一个有效字符下一个文件结束符的结尾 求大神指导?

#include <stdio.h>
#include <stdlib.h>
int main( int argc , char* argv[] )
{
	FILE* pfile = NULL;  // 文件指针
	int cnt = 0;	             // 文件字符数
	char ch = 0;                // 读取的文件字符
	int i = 0;                       // 循环变量

	// 打开文件
	pfile = fopen( "abc.txt" , "r" );
	if( !pfile )
	{
		fprintf( stderr , "cant not open the file !\n" );
	}

	// 设置文件指针
	fseek( pfile , 0L , SEEK_END );

        // 获取文件中字节数
	cnt = ftell( pfile );
	printf( "%d\n" , cnt );

        //倒序输出
	for( i = 1 ; i <= cnt ; ++ i )
	{
		fseek( pfile , -i , SEEK_END );
		ch = fgetc( pfile );
		printf( "%c" , ch );
	}
	printf( "\n" );

	// 关闭文件
	fclose( pfile );

	return 0;
}
40分
对于第一个结果 我不太懂windows的结果 因为 文件虽然有5个字符 但是还有一个文件结束符 所以最后应该是6个字符
文件结束符,根本就不会存在文件里。

对于第二个结果 我不懂linux的结果 就算要输出文件结束符 为什么会输出一个换行
Linux下的文本编辑器,会自动加上换行符

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen(“…”,”…”);fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen(“…”,”…b”);fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

把%c换成%x
引用 2 楼 zhao4zhong1 的回复:

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen(“…”,”…”);fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen(“…”,”…b”);fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

就楼主这个问题来说,根本不存在这个转换!
WINDOWS下的例子根本就没有换行符!
Linux下的例子确实有换行符,但是根本不存在这种转换!

我在CSDN论坛发帖内容中如未注明Linux,都默认仅Windows。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明文件读取的文件结束符
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!