C ++将文件名输入重定向转换为新的输出文本文件,并在新输出文件的名称后附加.txt

问题描述 投票:0回答:1

我试图使用输入重定向扫描文件的正则表达式,并将这些正则表达式与文件的行号输出到新的输出文本文件。输出文本文件是用于输入重定向的文件的名称,并附加“.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():basic_string :: _ M_construct null无效Aborted(core dumped)

我用的时候

的argv [2]

程序运行,但文件名错误,充满了乱码(溢出?):

也许这只是我问题的一部分。任何帮助将不胜感激。谢谢。

c++ file-io fstream io-redirection argv
1个回答
1
投票

您将标准输入与程序的命令行参数混淆。命令行参数是调用程序时在命令行中包含的字符串列表。例如:

$ ./myProgram arg1 arg2 ... argn

这些是通过argvargc读取的,它们分别代表“参数向量”和“参数计数”。按照惯例,第一个参数是程序的工作目录。在这个例子中,您将拥有:

argv == {"/path/to/myProgram", "arg1", "arg2", ..., "argn"}
argc == n

main的开头。你必须小心,不要通过检查argv读取argc超出范围,就像任何原始数组一样。

另一方面,标准输入是在整个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将读取文本,直到它到达第一个空格字符。幸运的是,有很简单的方法来read an entire line from stdinread everything from stdin

© www.soinside.com 2019 - 2024. All rights reserved.