[英]C++ Convert filename input redirection to new output text file with .txt appended to name of new output file
我正在尝试使用输入重定向来扫描文件中的正则表达式,并将这些正则表达式与文件的行号一起输出到新的输出文本文件中。 输出文本文件将是用于输入重定向的文件名,并在文件名后附加“ .txt”。 例如,如果程序运行如下:
./scanRegex <scanThisFile.log
然后应该调用输出文件
scanThisFile.log.txt
我创建了一个简单的程序,如下所示(减去正则表达式扫描以找出问题)。
main.cpp中
#include <iostream>
#include <ios>
#include <fstream>
#include <string>
#include <vector>
int main( int argc, char* argv[] )
{
std::string fileName = argv[1]; //<---===== ??????
std::string txt = ".txt\n";
char outputFile[100];
for( int i = 0; i < fileName.length(); ++i ){
outputFile[i] = fileName[i];
}
for( int i = fileName.length(); i < fileName.length() + 4; ++i ){
outputFile[i] = txt[i - fileName.length()];
}
std::ofstream outfile;
outfile.open(outputFile);
outfile << "It works!!";
outfile.close();
}
当我使用
argv [0]
程序运行,但文件名不符合我的意图,但可以理解,因为程序名称是argv的第一个参数:a.txt
当我使用
argv [1]
我收到以下运行时错误:
osboxes @ osboxes:〜/ Desktop / ps7 $ ./a <device1_intouch.log在引发'std :: logic_error'what()实例之后终止调用what():basic_string :: __ M_construct null无效中止(转储核心)
当我使用
的argv [2]
程序运行,但文件名错误并且充满乱码(溢出?):
也许这只是我的问题所在。 任何帮助将不胜感激。 谢谢。
您将标准输入与程序的命令行参数混淆了。 命令行参数是调用程序时在命令行中包含的字符串列表。 例如:
$ ./myProgram arg1 arg2 ... argn
通过argv
和argc
分别读取它们,它们分别表示“参数向量”和“参数计数”。 按照惯例,第一个参数是程序的工作目录。 在此示例中,您将具有:
argv == {"/path/to/myProgram", "arg1", "arg2", ..., "argn"}
argc == n
在main
开始时。 您必须小心,不要像其他任何原始数组那样通过检查argc
来超出argv
的范围。
另一方面, 标准输入是在对main
整个调用过程中提供给程序的数据流 。 这是使用std::cin
读取的。
int main(int argc, char** argv){
std::string s;
std::cin >> s; // read from standard input
}
当您运行该程序时,它将在指定的行处阻塞,直到从标准输入接收到数据为止。 在程序从命令行运行时,可以通过手动键入来提供此数据:
$ ./myProgram
hello
或通过输入重定向:
$ echo "hello" | ./myProgram
$ ./myProgram < hello.txt
在上面的三个示例中, s
将包含来自输入的文本的第一个单词,您可以将其用于下一行中的任何内容。
请注意, std::cin >> s
将读取文本,直到到达第一个空格字符为止。 幸运的是,有一些简单的方法可以从stdin读取整行并从stdin 读取所有内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.