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

ifstream read only one text file in for loop

本文关键字:一个 文件 文本 读取 for 循环 ifstream      更新时间:2023-10-16

我写了这个简单的代码,从我的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

您需要学习如何使用调试器。

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

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

第二个之后,它包含"D:\Text01.txtD:\Text02.txt"…

由于path是一个流,您需要像清除其他流一样清除它。

如果您检查了缓冲区的值,或者在文件无法打开时输出了一些文本,或者只是添加了任何类型的错误报告,您就会看到这种情况。

也许它会帮助到别人。并且一定不要在这里使用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;

}

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

现在,我们可以使用一个更通用、更有用的概念RAII:,而不是明确地"重置"那个(不仅是那个(变量

"资源获取就是初始化"技术。基本理念是用本地对象表示资源,以便对象的析构函数将释放资源。这样程序员不能忘记释放资源。。。(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;
}
相关文章: