ifstream只读取for循环中的一个文本文件

时间:2016-08-07 12:25:07

标签: c++

我写了这个简单的代码,从我的D目录中读取4个文本文件,将其放在字符串向量中,然后逐个从向量中取出这些字符串并将其显示给用户。问题是它只读取第一个文件的内容,而不读取其他文件的内容。它有什么问题.....提前谢谢

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

int main(){

    std::string line;
    std::stringstream ss;
    std::stringstream path;
    std::vector<std::string> vectorOfStrings;
    ifstream readFile;


    for(int i=1; i<= 4; i++)
    {

    path << "D:\\Text0"<< i <<".txt";
    readFile.open(path.str());

    if(readFile.is_open())
    {
        while(!readFile.eof())
        {
            getline(readFile, line);
            ss << line << "\n";

        }   
        ss<< "\n ***************************************\n";
        vectorOfStrings.push_back(ss.str());
        ss.str("");
        readFile.close();
        readFile.ignore();
        readFile.clear();
    }
    }


    ss << vectorOfStrings.at(0);
    cout<<ss.str();
    ss.str("");

    ss << vectorOfStrings.at(1);
    cout<<ss.str();
    ss.str("");

    ss << vectorOfStrings.at(2);
    cout<<ss.str();
    ss.str("");

    ss << vectorOfStrings.at(3);
    cout<<ss.str();
    ss.str("");

    return 0;
} 
位于我的D盘中的

文件是Text01.txt,Text02.txt,Text03.txt,Text04.txt

3 个答案:

答案 0 :(得分:2)

您需要了解如何使用调试器。

path << "D:\\Text0"<< i <<".txt";

第一次迭代后,path的缓冲区包含“D:\ Text01.txt”。

在第二个之后,它包含“D:\ Text01.txtD:\ Text02.txt”......

由于path是一个流,您需要以清除其他流的方式清除它。

如果您检查了缓冲区的值,或者在文件无法打开时输出了一些文本,或者实际上只是添加了任何类型的错误报告,那么您已经看过了。

答案 1 :(得分:0)

也许它会帮助别人。并且在这里使用if(readFile.is_open())。因为它写了两次当前文件的矢量值

   #include "stdafx.h"
   #include<iostream>
   #include<fstream>
   #include<string>
   #include<sstream>
   #include<vector>

   using namespace std;

 int main(){
   ifstream stream1;
   string str;
   vector<string> list;
   stringstream ss;
   stringstream path;
   stringstream res;

for(int i = 1; i < 4; i++)
{
path << "file" << i << ".txt";
stream1.open(path.str());

if(stream1.is_open())
{

        getline(stream1, str);
        cout << str << endl;
        ss << str << " \n ";
        list.push_back(ss.str());

    stream1.close();
}

path.str(string());
ss.str(string());
}

cout << " ----------------- " << endl;

for (int i = 0; i < list.size(); i++)
{
    ss << list.at(i);
    cout << ss.str();
    ss.str(string());
}

return 0;

}

答案 2 :(得分:0)

正如其他人所指出的那样,问题是每次循环后path都没有被清除。

现在,而不是明确&#34;重置&#34;那个(而不仅仅是那个)变量我们可以使用更通用和有用的概念调用RAII

  

“资源获取是初始化”技术。基本的想法   是由本地对象表示资源,以便本地   object的析构函数将释放资源。那样的话   程序员不能忘记发布资源......(https://isocpp.org/wiki/faq/exceptions#finally

例如,OP的代码可以这样修改:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>

int main() {
    std::vector<std::string> vectorOfStrings;

    for ( int i = 1; i <= 4; i++ )
    {
        std::stringstream path;
        path << "D:\\Text0" << i << ".txt";
        std::ifstream readFile(path.str());

        if ( !readFile )
        {
            std::cerr << "Error: Unable to open file " << path.str() << '\n';
            break;
        }
        std::string line;
        std::stringstream ss;
        while( getline(readFile, line) )
        {
            ss << line << "\n";
        }
        ss << "\n ***************************************\n";
        vectorOfStrings.push_back(std::move(ss.str()));
    }

    for ( const auto &s : vectorOfStrings ) {
        std::cout << s;
    }

    return 0;
}