杂记
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下,文本模式会将\n输出成\r\n,读取时也会将\r\n变成一个\n;所以开始程序B读取文件F并且计算MD5时,是以\n来计算的。然而当从服务器上下载下来时,文件是以\r\n作为行结尾的,直接计算MD5会导致值不一样。而将下载下来的文件保存时,由于仍然使用的文本模式,将\r\n变成了\r\r\n,导致了当初匪夷所思的结果。
“使用二进制文件模式时,程序将数据从内存传递给文件(反之亦然)时,将不会发生任何隐藏的转换,而默认的文本模式并非如此。例如,对于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