杂记

1.默认fopen只能打开2G以下的文件,

2.fopen以更新方式打开文件(模式中+号,例如“r+”/“w+”/“a+”),不能读完就写,写完就读,中间需要调用干预函数(例如fseek等)进行读写转换。

Question:http://bbs.csdn.net/topics/391907768

Solution:http://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html

3.http://www.cnblogs.com/ascii0x03/p/4838671.html

默认使用文本模式读写文件惹的祸:windows下,文本模式会将 输出成 ,读取时也会将 变成一个 ;所以开始程序B读取文件F并且计算MD5时,是以 来计算的。然而当从服务器上下载下来时,文件是以 作为行结尾的,直接计算MD5会导致值不一样。而将下载下来的文件保存时,由于仍然使用的文本模式,将 变成了 ,导致了当初匪夷所思的结果。

“使用二进制文件模式时,程序将数据从内存传递给文件(反之亦然)时,将不会发生任何隐藏的转换,而默认的文本模式并非如此。例如,对于Windows文本文件,他们使用两个字符的组合吧(回车和换行)表示换行符;Mac文本文件使用回车表示换行符;而UNIX和Linux文件使用换行来表示换行符。C++是从UNIX系统上发展而来的,因此也使用换行来表示换行符。为增加可移植性,Windows C++程序在写文本模式文件时,自动将C++换行符转换为回车和换行;Mac C++程序在写文件时,将换行符转换为回车。在读取文本文件时,这些程序将本地换行符转换为C++模式。对于二进制数据,文本格式会引起问题,因为double值中间的字节可能与换行符的ASCII码有相同的位模式。另外,在文件末尾的检测方式也有区别。因此以二进制格式保存数据时,应使用二进制文件模式。”

4.使用fwrite向文件写入结构体时,包含结构体对齐产生的补齐字节

5.有符号整型进行移位操作结果是与编译器有关的,简而言之,不要对有符号整型数进行位移操作.

例如想要取int型最大值

//正确
int max = ~0U >> 1;
//错误
int max = ~0 >> 1;//wrong way

6.判断一个整数是否是 2的幂

n &(n-1) == 0 ? 1 : 0

7.编写C程序的注意

效率与可维护性 可移植性

8.popen()打开的文件描述符是管道,不能对其执行 fseek()等操作,否则 pclose()时会导致coredump

原文地址:https://www.cnblogs.com/LubinLew/p/Hodgepodge.html