读书人

关于C++中文件流的有关问题想问一上大

发布时间: 2012-08-30 09:55:54 作者: rapoo

关于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分别表示什么类型的数据。

读书人网 >C++

热点推荐