经典问题:使用a+b模式,能读能写,但是发现不能覆盖原有记录内容。 原因分析:凡是使用了a之后,每次写数据都会在文件末尾写,而不管你把文件指针移动到哪里。用w的话,虽说不会产生总在末尾写的情况了,但每次打开文件,都会把文件清空。应该用"r+b",这样不会清空文件,也不会总在末尾写。只不过有一点要注意,由于写入和读出都使用同一个缓冲,为了防止意外发生,在写和读之间最好先刷新一下缓冲:用fflush()、fseek()或者rewind()等函数都可以,这些函数调用时都会刷新缓冲区。唯一的缺点是要首先创建这个文件。 经典问题:写入文件的代码为fprintf(fp,"%d,%d",a,b); 读出文件的代码为fscanf(fp,"%d",&a); fscanf(fp,"%d",&b); 中间的逗号哪儿去了? 原因分析:无 经典问题:读出字符串到CString,按照一般的写法 --- CString str;fscanf(fp,“%s”,&str) 不光str会出现问题,并且会影响到后面文件的关闭,出现一些奇怪的错误,切忌切忌。应该写成fscanf(fp,“%s”,str) , 但是fscanf碰到空格就会停止,有点不好; 或者使用 CString szContent; int nFileLength = file.GetLength(); file.Read(szContent.GetBuffer(nFileLength),nFileLength); szContent.ReleaseBuffer(); 经典问题:读出字符串到string,用fgets先读出char*的buf,然后赋值,发现有换行符。通过下面这样的写法去掉换行符。 while(fgets(buf,255,fp2)) { string str(buf,strlen(buf)-1); } 但是有时候最后一行并没有换行符结尾,就会出问题,因此最好加上判断 while(fgets(buf,255,fp2)) { int nlength = strlen(buf); string str(buf,nLength); if(str[nLength] == '\n') str.erase(nLength,1); } 经典问题:stat可以得到文件的大小。但是如果文件被打开(fopen)并未被关闭(fclose),在此之间写入文件的内容大小,并未由_stat得到,其得到的仍然是原始大小。小文件建议使用ftell获得,大文件通过GetFileSize得到。 陆续更新中。。。。

评论