C++中打开文件的问题

57 篇文章 1 订阅
昨天老师要求用赫夫曼算法实现一个简单的解压缩程序,我先做了一个文本类Text:
C++中打开文件的问题
大致想法是将用户输入的待压缩或待解压的文件路径保存在path中(DOS就是这么麻烦。。。),在length中保存文本中字符长度(包括空格)。
在写showText()方法时,却发现path无法作用:
C++中打开文件的问题
以下是编译器毫不留情的报错:
C++中打开文件的问题
在使用强制转换也无效后,我只好用了一个笨办法:将path中的字符逐个的装入字符数组中,再将字符数组的首地址放入一个字符指针常量中。以下是改进的代码,增加了一个转换的函数:
C++中打开文件的问题
这次编译顺利通过,但结果依然惨淡:(测试文本为test.txt,内容:this is a test.)
C++中打开文件的问题
图中数字是我在主函数中输出的length.显然ifstream in(p)并没有真正执行。
仔细一想,string类事实上就是对字符数组的封装而已,换句话说,string里字符数组仍然存在。本着这个想法,我在string的方法里找到了c_str()。c_str()方法返回一个C风格 的指针,指向string的值
再次修改代码,删除了麻烦的stringToCharArray():
C++中打开文件的问题
这回编译器就像我一样愉快地接受了这个办法:
C++中打开文件的问题
查看了MSDN后,又发现了一个data()方法。
C++中打开文件的问题
如上三种方法中,输出都是相同的。至于data()和c_str()的区别,网上的一些帖子中认为:
data()得到的是字符数组,里面有 '\0 ',当然也不会删掉,string的原则就是无视这个c字符串规则.
而c_str()是产生c字符串,也就是即使没有 '\0 '结尾,她也会添加一个.
总的来说,也就是字符数组和C字符串的区别。

以下是vs7.1(话说什么是VS7.1?)下的两个函数的源码:
const   _Elem   *c_str()   const 
{ //   return   pointer   to   null-terminated   nonmutable   array 
return   (_Myptr()); 
} 

const   _Elem   *data()   const 
{ //   return   pointer   to   nonmutable   array 
return   (c_str()); 
}


回过头来考虑第一种方法:
在第一种修改方法中,已经自行将string的内容复制到了字符数组中,并将字符数组的首地址赋予了字符指针常量p,但在ifstream in(p);后仍然没有读入文本。下午英语期中考试完后和同学讨论,总算得出了原因:没有在获得的字符数组最后一位加上C串的结束符:"\0"。。。。。。
修正后的代码如下:
C++中打开文件的问题

这次就正常运行啦~~~
依据刚刚拿到的大部头《C++ Primer》,总结一下这篇一堆图的小文:
由于历史原因,IO标准库使用C风格字符串而不是C++ string类型的字符串作为文件名。在创建fstream对象时,如果调用open或使用文件名作初始化,需要传递的实参应为C风格字符串,而不是标准库string对象。程序常常从标准输入获得文件名。通常,比较好的方法是将文件名读入string对象,而不是C风格字符数组。假设要使用的文件名保存在string对象中,则可调用C_str成员获取C风格字符串。
欢迎指正!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值