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