最近刚刚使用VC2010,昨晚遇到了文件的读写问题,因为和VC6.0的函数使用略有不同,在这里和大家也分享一下。
众所周知,VC6.0打开文件使用函数fopen,到了VC2010情况有些改变,微软建议我们使用fopen_s。
在VC6.0中打开文件语句如下:
FILE *fp=fopen("D:\fileNameList.txt","r");
如果打开文件不成功则fp为空指针。
在VC2010中打开文件语句如下:
FILE *stream;
errno_t err;
err=fopen_s(&stream,"D:\filenamelist.txt","r");
当打开文件成功时stream的值不为NULL,但是它的内容却是0x00000000,这个和6.0有很大的不同,笔者以为这是打开文件错误,但其实不是。
下边的工作就是把文件的内容读进来了,首先可以利用fseek( stream, 0L, SEEK_SET );找到文本文件的开始位置。
VC6.0可以使用fscanf(fp,"%s",&fileName);但是到了VC2010,fscanf也失效了,需要使用fscanf_s。这里其实有个陷阱,笔者理所当然的使用了fscanf_s(fp,"%s",&fileName);结果各种内存报错,本来以为是打开文件的问题,弄了N久也找不出打开文件的错误,最后还是求助于VC2010的MSDN,发现了问题的所在,原来VC2010读入文件中的字符串要写成这样:
fscanf_s(stream,"%s",&filedir,1024);
即要指定读入字符串的长度,看来MSDN还是相当重要的,特别是里边的例子要仔细研读呀。
另外附加按行读入文件的语句:
fgets(filename, 1024, stream); // 读取1024字节数据或者到一行结束的数据
通过今天下午的实践发现使用fgets来按行读取文件具有一个非常严重的弊端。就是它会在你读取出的filename最后加一个换行符,这个换行符非常致命。如果文本文件保存的是文件名列表的话,利用fgets读出的filename根本无法使用。
经过一番搜索,发现ifstream 是按行读取文本文件的利器,而且使用非常简单。
首先,需要包含fstream.h头文件。
ifstream fin("data.txt");
fin.getline(str,LINE_LENGTH); 即可把文件按行读入到str数组中,而且数组结尾不加换行符。
呵呵,搞定,收工,欢迎大家交流讨论呀。
https://blog.sciencenet.cn/blog-702148-605072.html
上一篇:
cmd批处理命名:生成本文件夹包括子文件夹下的所有文件名列表下一篇:
chrome浏览器罗技鼠标滚轮不正常的解决方案