Boyuan's Research Blog分享 http://blog.sciencenet.cn/u/tyfbyfby My homepage: www.patternrecognition.cn/~fengboyuan/

博文

浅谈VC2010的文件读入问题

已有 12319 次阅读 2012-8-23 10:12 |个人分类:图像工具|系统分类:科研笔记| 读文件, VC2010, 按行, 读取文件, fopen_s


        最近刚刚使用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浏览器罗技鼠标滚轮不正常的解决方案
收藏 IP: 171.117.94.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (6 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-26 06:36

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部