我是C ++的新手并撰写我的硕士论文,非常感谢我能得到的任何帮助!
我有一个程序读取txt文件,然后进行一堆计算,并返回一个新的txt文件。问题是我想为100多个不同的输入文件运行这个程序。现在我必须在代码中更改输入文件的名称,但我想让它自己运行我文件夹中的所有输入文件。
我使用的是Visual Studio,但只有很少的C ++经验。
谢谢:)
答案 0 :(得分:1)
使用bash,你可以使用:
运行它们$ for file in /Data/*.txt; do /path/your_program $file; done
答案 1 :(得分:1)
请参阅此代码段。由于您使用的是MSCV,因此需要在此控制台应用程序的配置中启用MFC。另外在#include "afx.h"
中添加#include "stdafx.h"
,其中CFileFind
已定义。 PopulateFromFolder()
应自动将文件加载到向量files
。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
void PopulateFromFolder(string path, vector<string>& files)
{
CFileFind finder;
CString fileName;
fileName.Format(L"%s*.*", CString(path.c_str()));
BOOL bOk = finder.FindFile(fileName);
while (bOk)
{
bOk = finder.FindNextFile();
if (finder.IsDots())
{
continue;
}
if (!finder.IsDirectory())
{
CString strFileName = finder.GetFileName();
files.push_back(CStringA(strFileName).GetString());
}
}
finder.Close();
}
int main()
{
vector<string> files;
string path = "D:\\MyFolder\\";
PopulateFromFolder(path, files);
auto a = path + files[0];
int i = 0;
while (i< files.size()-1)
{
cout << "processing " << files[i + 1] << endl;
ifstream fs(path+files[i++]);
if (fs.is_open())
{
//do something
}
fs.close();
}
return 0;
}
输出:
答案 2 :(得分:0)
您可以为输入文件名定义格式,然后放入某个目录。例如,
Input1.txt
Input2.txt
...
Input111.txt
然后使用某种for
循环:
for(int i = 1; i <= 111; ++i)
{
ifstream file("Input" + std::to_string(i) + ".txt");
if (file.is_open())
Operate(file);
}
如果您不知道文件的确切数量,可以通过is_open()
方法检查文件是否已打开。这样,可以不存在具有某些数字的文件。您只需循环输入最大可能的输入文件ID。
这是一个不需要任何依赖关系的解决方案。但如果你不介意,你实际上可能会考虑Boost.Filesystem。这是一个example。
答案 3 :(得分:0)
您可以尝试使用std::experimental::filesystem
(http://en.cppreference.com/w/cpp/experimental/fs)。我想这个库中的directory_iterator
对你有用 - 它允许你迭代给定目录中的所有文件。请查看文档中提供的示例:http://en.cppreference.com/w/cpp/experimental/fs/directory_iterator。
但是,您必须确保使用新标准编译代码(C ++ 17)。
另一种方法是制作一个单独的文件,其中包含您要处理的所有文件的名称列表。然后,您可以阅读此列表,并为每个文件执行您需要的操作。