C++如何通过命令行参数读取txt文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/30141000/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++ How to pass command line argument to read txt file
提问by Hiroki
What I've been trying to do is...
我一直在努力做的是...
1) to read txt files by command line argument,
1)通过命令行参数读取txt文件,
2) to use strings in the txt files as arguments for the main method (or whatever method you need to invoke).
2) 将 txt 文件中的字符串用作 main 方法(或您需要调用的任何方法)的参数。
For example, there are two txt files, one of which is named character.txt and the other match.txt.
例如,有两个txt文件,其中一个名为character.txt,另一个名为match.txt。
The contents of the files would be like this.
文件的内容将是这样的。
character.txt
字符.txt
//This comprises of six rows. Each of the rows has two string values
Goku Saiyan
Gohan Half_Saiyan
Kuririn Human
Piccolo Namekian
Frieza villain
Cell villain
match.txt
匹配.txt
//This comprises of three rows, each of them is one string value
Goku Piccolo
Gohan Cell
Kuririn Frieza
If I use those strings without using command line, I'd declare the strings in character.txt like this.
如果我在不使用命令行的情况下使用这些字符串,我会像这样在 character.txt 中声明这些字符串。
typedef string name; //e.g. Goku
typedef string type; //e.g. Saiyan, Human, etc
Now I'm looking for how to read and send string values from txt files like the ones above, and to use them for functions inside the main method, ideally like this way.
现在我正在寻找如何从上面的 txt 文件读取和发送字符串值,并将它们用于 main 方法中的函数,最好是这样。
int main(int argc, char *argv)
{
for (int i = 1; i < argc; i++) {
String name = *argv[i]; //e.g. Goku
String type = *argv[i]; //e.g. Saiyan, Human, etc
String match = * argv[i]; //Goku Piccolo
//I don't think any of the statements above would be correct.
//I'm just searching for how to use string values of txt files in such a way
cout << i << " " << endl; //I'd like to show names, types or matchs inside the double quotation mark.
}
}
Ideally, I'd like to invoke this method in this way.
理想情况下,我想以这种方式调用此方法。
According to this web site., at least I understand it is possible to use command line arguments with C++, but I cannot find any more information. I'd appreciate if you'd give any advice on it.
根据这个网站。,至少我知道可以在 C++ 中使用命令行参数,但我找不到更多信息。如果您对此有任何建议,我将不胜感激。
PS. I'm using Windows and Code Blocks.
附注。我正在使用 Windows 和代码块。
采纳答案by str14821
Asuming you just want to read contents of the files and process it, you can start with this code (Without any errors checks tho). It simply gets filenames from command line and reads file contents into 2 vectors. Then you can just process these vectors as u need.
假设您只想读取文件的内容并处理它,您可以从这段代码开始(没有任何错误检查)。它只是从命令行获取文件名并将文件内容读入 2 个向量。然后您可以根据需要处理这些向量。
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
std::vector<std::string> readFileToVector(const std::string& filename)
{
std::ifstream source;
source.open(filename);
std::vector<std::string> lines;
std::string line;
while (std::getline(source, line))
{
lines.push_back(line);
}
return lines;
}
void displayVector(const std::vector<std::string&> v)
{
for (int i(0); i != v.size(); ++i)
std::cout << "\n" << v[i];
}
int main(int argc, char **argv)
{
std::string charactersFilename(argv[1]);
std::string matchesFilename(argv[2]);
std::vector<std::string> characters = readFileToVector(charactersFilename);
std::vector<std::string> matches = readFileToVector(matchesFilename);
displayVector(characters);
displayVector(matches);
}
回答by Marware
First the main function prototype should be
首先主函数原型应该是
int main(int argc, char **argv)
OR
或者
int main(int argc, char *argv[])
Second after retrieving files names in the main function you should open each file and retrieve its contents
在主函数中检索文件名后,您应该打开每个文件并检索其内容
Third Sample code
第三个示例代码
int main(int argc, char* argv[])
{
for(int i=1; i <= argc; i++) // i=1, assuming files arguments are right after the executable
{
string fn = argv[i]; //filename
cout << fn;
fstream f;
f.open(fn);
//your logic here
f.close();
}
return 0;
}
回答by KooKoo
to see how to use command line arguments look at this.
要了解如何使用命令行参数,请看这个。
http://www.cplusplus.com/articles/DEN36Up4/
http://www.cplusplus.com/articles/DEN36Up4/
you cannot use the contents of the file which you have passed to your app through command line arguments. only the name of the file is passed to the app.
您不能使用通过命令行参数传递给应用程序的文件内容。只有文件名会传递给应用程序。
you should open the file using that name and read its contents. take a look at this:
您应该使用该名称打开文件并阅读其内容。看看这个:
回答by myaut
You define main
prototype incorrectly. You also need std::ifstream
to read files.
您main
错误地定义了原型。您还需要std::ifstream
读取文件。
If you expect exactly two arguments, you may check argc
and extract arguments directly:
如果您期望正好有两个参数,您可以argc
直接检查和提取参数:
int main(int argc, char* argv[]) {
if(argc != 3) {
std::cerr << "Usage: " << argv[0]
<< " name.txt match.txt" << std::endl;
return 1;
}
std::ifstream name_file(argv[1]);
std::ifstream match_file(argv[2]);
// ...
return 0;
}
If you expect unspecified number of files, than you need a loop and an array to save them, i.e. vector
:
如果您期望未指定数量的文件,那么您需要一个循环和一个数组来保存它们,即vector
:
int main(int argc, char* argv[]) {
std::vector<std::ifstream> files;
for(int i = 1; i < argc; ++i)
files.emplace_back(argv[i]);
// ...
return 0;
}
And do not forget to check if files are openable.
并且不要忘记检查文件是否可以打开。