ifstream只读取for循环中的一个文本文件
ifstream read only one text file in for loop
我写了这个简单的代码,从我的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;
}
相关文章:
- 挂起和取消挂起一个文件DLL
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- C++试图读取一个文件并输出到另一个文本文件
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何将class.cpp和class.hpp编译为一个.o文件
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 如何从整个磁盘中排除要装载的一个文件
- 如何将模板和非模板函数放在一个文件中
- 如何在安卓工作室中将c ++头文件从一个文件夹导入到另一个文件夹?
- 使用 scope 运算符 (::) 引用另一个文件中的类
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 在 c++ 中打开文件、删除标点符号并追加到另一个文件中
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- c++ 提升如果 .extension() == " "这意味着这个文件是一个文件夹?
- 是否可以在 c++ 中创建一个文件并为其提供属性以将其隐藏?(在 Ubuntu 上)
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?