关于C++中文件流的问题想问一下大家
先上代码,再说疑惑。
- C/C++ code
#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);这一行的意义和作用,希望大家能够帮忙指点一下,说详细点更好或者给我解决问题的链接让我自己看也行,先谢谢大家了。
[解决办法]
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的操作将失败
希望对你有所帮助。
[解决办法]
简单点说,ite是一个指针,指向了vector中一个stirng对象,*ite是指string对象,str函数需要一个string参数,所以将*ite作为参数传递,把一个string对象拷贝到了isstream当中,要注意理解函数参数以及ite和*ite分别表示什么类型的数据。