C++中打开文件的问题
2012-11-03 11:02
190 查看
昨天老师要求用赫夫曼算法实现一个简单的解压缩程序,我先做了一个文本类Text:
大致想法是将用户输入的待压缩或待解压的文件路径保存在path中(DOS就是这么麻烦。。。),在length中保存文本中字符长度(包括空格)。
在写showText()方法时,却发现path无法作用:
以下是编译器毫不留情的报错:
在使用强制转换也无效后,我只好用了一个笨办法:将path中的字符逐个的装入字符数组中,再将字符数组的首地址放入一个字符指针常量中。以下是改进的代码,增加了一个转换的函数:
这次编译顺利通过,但结果依然惨淡:(测试文本为test.txt,内容:this is a test.)
图中数字是我在主函数中输出的length.显然ifstream in(p)并没有真正执行。
仔细一想,string类事实上就是对字符数组的封装而已,换句话说,string里字符数组仍然存在。本着这个想法,我在string的方法里找到了c_str()。c_str()方法返回一个C风格的指针,指向string的值。
再次修改代码,删除了麻烦的stringToCharArray():
这回编译器就像我一样愉快地接受了这个办法:
查看了MSDN后,又发现了一个data()方法。
如上三种方法中,输出都是相同的。至于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++ Primer》,总结一下这篇一堆图的小文:
由于历史原因,IO标准库使用C风格字符串而不是C++ string类型的字符串作为文件名。在创建fstream对象时,如果调用open或使用文件名作初始化,需要传递的实参应为C风格字符串,而不是标准库string对象。程序常常从标准输入获得文件名。通常,比较好的方法是将文件名读入string对象,而不是C风格字符数组。假设要使用的文件名保存在string对象中,则可调用C_str成员获取C风格字符串。
欢迎指正!
大致想法是将用户输入的待压缩或待解压的文件路径保存在path中(DOS就是这么麻烦。。。),在length中保存文本中字符长度(包括空格)。
在写showText()方法时,却发现path无法作用:
以下是编译器毫不留情的报错:
在使用强制转换也无效后,我只好用了一个笨办法:将path中的字符逐个的装入字符数组中,再将字符数组的首地址放入一个字符指针常量中。以下是改进的代码,增加了一个转换的函数:
这次编译顺利通过,但结果依然惨淡:(测试文本为test.txt,内容:this is a test.)
图中数字是我在主函数中输出的length.显然ifstream in(p)并没有真正执行。
仔细一想,string类事实上就是对字符数组的封装而已,换句话说,string里字符数组仍然存在。本着这个想法,我在string的方法里找到了c_str()。c_str()方法返回一个C风格的指针,指向string的值。
再次修改代码,删除了麻烦的stringToCharArray():
这回编译器就像我一样愉快地接受了这个办法:
查看了MSDN后,又发现了一个data()方法。
如上三种方法中,输出都是相同的。至于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++ Primer》,总结一下这篇一堆图的小文:
由于历史原因,IO标准库使用C风格字符串而不是C++ string类型的字符串作为文件名。在创建fstream对象时,如果调用open或使用文件名作初始化,需要传递的实参应为C风格字符串,而不是标准库string对象。程序常常从标准输入获得文件名。通常,比较好的方法是将文件名读入string对象,而不是C风格字符数组。假设要使用的文件名保存在string对象中,则可调用C_str成员获取C风格字符串。
欢迎指正!
相关文章推荐
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题 Microsoft SQL Server Compact 3.5
- C++问题-无法打开包括文件:“GLES2/gl2.h”
- 关于C++中open打开文件函数的诡异的问题
- 解决vs2010“创建或打开C++浏览数据库文件... 发生错误....”的问题
- c++关于文件打开目录的问题
- Eclipse打开C/C++文件报错问题
- 解决vs创建或打开C++浏览数据库文件*.sdf时发生错误的问题
- VC2010 + C++ + OpenCV 项目开发环境搭建 —— OpenCV 无法打开包括文件 找不到头文件问题
- Eclipse打开C/C++文件报错问题
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题"
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题"
- 创建或打开C++浏览数据库文件 发生错误”的问题
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题"
- 解决Visual studio"创建或打开C++浏览数据库文件***发生错误”的问题
- C++ 流对象多次打开文件出错问题
- 解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题" .
- 解决VS2010创建工程时弹出“创建或打开C++浏览数据库文件 发生错误”的问题"
- visual studio 2008安装出现"无法打开数据文件问题"
- ubuntu下解决无法解析或打开软件包列表或状态文件的问题