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

时间:2019-04-27 17:06:56

标签: c++ file-io fstream io-redirection argv

我正在尝试使用输入重定向来扫描文件中的正则表达式,并将带有文件行号的正则表达式输出到新的输出文本文件中。输出文本文件将是用于输入重定向的文件名,并在文件名后附加“ .txt”。例如,如果程序运行如下:

  

./ scanRegex

然后将输出文件命名为

  

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

当我使用

  

argv [2]

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

也许这只是我的问题所在。任何帮助将是 大大地 赞赏。 谢谢。

1 个答案:

答案 0 :(得分:1)

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

  

$ ./myProgram arg1 arg2 ... argn

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

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

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

另一方面,标准输入是数据的,该数据流在整个{em 1}}。这是使用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将读取文本,直到到达第一个空格字符为止。幸运的是,有read an entire line from stdinread everything from stdin

的简便方法