CXD Linux Engineer

fopen函数打开二进制和文本文件的区别

2017-03-10

Linux系统

在Linux系统中使用man fopen命令查看fopen函数的帮助信息可以看到下面这段话:
fopen-linux
意思就是fopen函数在指定文件打开模式的时候可以在后面加一个b字符,这只是为了兼容C标准,在所有POSIX标准的系统上这个字符没有任何实际用处,包括Linux。其他系统上(例如 windows)fopen函数对文本文件和二进制文件的处理方式不一样,所以要加一个b字符来区分。如果你的程序需要移植到其他系统上,使用fopen函数打开二进制文件时加一个b字符是个好主意。

Windows系统

在msdn上查找fopen函数的用法时看到如下信息:
fopen-windows
意思是使用二进制模式打开文件,禁止回车符和换行符的翻译。
在Windows系统上当文本读取时,它每遇到一个\r\n将其翻译为\n,然后送到读缓冲区。 文本方式写时,每遇到一个\n(0AH换行符),它将其换成\r\n(0D0AH,回车换行),然后再写入文件。 所以Windows系统上文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上。

测试

测试函数如下,向文件中写入字符串abcdefghijklmn\n和数字0x12345678

int main()
{
	FILE *fd = NULL;
	char str[] = "abcdefghijklmn\n";
	int num = 0x12345678;

	fd = fopen("hello.txt", "wb+");
	if (fd == NULL) {
		printf("The file open filed\n");
		return -1;
	}
	else
		printf("The file open success\n");

	fwrite(str, sizeof(str), 1, fd);
	fwrite(&num, sizeof(int), 1, fd);
	fclose(fd);

	return 0;
}
  • fopen函数二进制方式打开文件如下:
    b_1

  • fopen函数文本方式打开文件如下:
    t_2

注:这是一个面试题,当时问的我不知所措。。。


Comments

Content