关于C++中文件流的问题想问一下大家

psp0215 2012-08-07 11:04:56
先上代码,再说疑惑。

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
using namespace std;

int fileToVector(string fileName, vector<string>& svec)
{
//创建ifstream对象inFile并绑定到由形参fileName指定的文件
ifstream inFile(fileName.c_str());
if (!inFile)
return 1;

string s;
while (getline(inFile, s))
svec.push_back(s);
inFile.close();
if (inFile.eof())
return 4;
if (inFile.bad())
return 2;
if (inFile.fail())
return 3;
}

int main( void )
{
vector<string> svec;
string fileName, s;

//读入文件名
cout << "Enter filename :" << endl;
cin >> fileName;

//处理文件
switch (fileToVector(fileName, svec))
{
case 1:
cout << "error: can not to open file: "
<< fileName << endl;
return -1;
case 2:
cout << "error: system failure " << endl;
return -1;
case 3:
cout << "error: read failure " << endl;
return -1;
}

string word;
istringstream isstream;
for (vector<string>::iterator iter = svec.begin();
iter != svec.end(); ++iter)
{
isstream.str(*iter);
while (isstream >> word)
{
cout << word << endl;
}
isstream.clear();
}
system("pause");
return 0;
}

这是C++ primer上的一个习题,我不明白的是ifstream inFile(fileName.c_str());这一行,还有isstream.str(*iter);这一行的意义和作用,希望大家能够帮忙指点一下,说详细点更好或者给我解决问题的链接让我自己看也行,先谢谢大家了。
...全文
181 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
psp0215 2012-08-08
  • 打赏
  • 举报
回复
嗯,谢谢你的回复,明白了一些。
[Quote=引用 3 楼 的回复:]
简单点说,ite是一个指针,指向了vector中一个stirng对象,*ite是指string对象,str函数需要一个string参数,所以将*ite作为参数传递,把一个string对象拷贝到了isstream当中,要注意理解函数参数以及ite和*ite分别表示什么类型的数据。
[/Quote]
psp0215 2012-08-08
  • 打赏
  • 举报
回复
先谢谢你,你的意思就是说basic_ifstream模板类的构造函数接受const char*类型的指针,所以要用c.str()函数做一次转换。而不能够直接使用fileName做参数,这句代码是不是还表示需要读写文件时,则必须定义自己的对象,并将它门绑定在需要的文件上,fileName相当于需要读的文件,所以用ifstream infile(fileName.c_str());将infile绑定到fileName上。是吧。
[Quote=引用 1 楼 的回复:]
typedef basic_ifstream<char, char_traits<char> > ifstream;
即ifstream是basic_ifstream模板类的特化,而basic_ifstream模板类的构造函数接受const char*类型的指针,因此需要通过string类的c_str方法返回fileName的const char*类型的指针,而不能简单地传递fileName作为……
[/Quote]
种菜的 2012-08-08
  • 打赏
  • 举报
回复
简单点说,ite是一个指针,指向了vector中一个stirng对象,*ite是指string对象,str函数需要一个string参数,所以将*ite作为参数传递,把一个string对象拷贝到了isstream当中,要注意理解函数参数以及ite和*ite分别表示什么类型的数据。
blldw 2012-08-07
  • 打赏
  • 举报
回复
typedef basic_ifstream<char, char_traits<char> > ifstream;
即ifstream是basic_ifstream模板类的特化,而basic_ifstream模板类的构造函数接受const char*类型的指针,因此需要通过string类的c_str方法返回fileName的const char*类型的指针,而不能简单地传递fileName作为构造函数的参数。

typedef basic_istringstream<char> istringstream;
即istringstream是basic_istringstream模板类的特化,basic_istringstream模板类的str方法有两种形式的重载,即
basic_string<Elem, Tr, Alloc> str( ) const;
void str(
const basic_string<Elem, Tr, Alloc>& _Newstr
);
其中,第一种形式的重载返回basic_istringstream模板类对象中的字符串序列,而第二种则是将参数_Newstr设置为basic_istringstream模板类对象中容纳的字符串序列。在你的例子中:
isstream.str(*iter); // 将*iter的内容拷贝到isstream对象中
while (isstream >> word) // 解析isstream中的字符串,并赋值给word,知道解析失败
{ // 此时,isstream的状态为eofbit == true
cout << word << endl;
}
isstream.clear(); // 将isstream对象的状态重置为正常,一边后继的循环操作,如果
// 不重置,后继对isstream的操作将失败

希望对你有所帮助。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧