经典问题:使用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得到。
陆续更新中。。。。
评论