C ++文件重定向

时间:2013-08-06 13:25:30

标签: c++ file

为了加快输入速度,我读到您可以执行file-redirection并包含已设置cin输入的文件。

理论上它应该像下面那样使用

App.exe inputfile outputfile

据我在C ++ Primer一书中所理解,以下C ++代码[1]应该从文本文件中读取cin输入,不需要像[2]这样的任何其他特殊指示

[2]

include <fstream>
ofstream myfile;
myfile.open ();

[1]以下C ++代码......

#include <iostream>
int main(){
    int val;
    std::cin >> val; //this value should be read automatically for inputfile
    std::cout << val;
    return 0;
}

我错过了什么吗?

4 个答案:

答案 0 :(得分:17)

要使用您的代码[1],您必须像这样调用您的程序:

App.exe < inputfile > outputfile

您也可以使用:

App.exe < inputfile >> outputfile

在这种情况下,输出不会在每次运行命令时重写,但输出将附加到现有文件。

有关在Windows中重定向输入和输出的详细信息,您可以找到here


请注意,{em>逐字输入<>>>符号 - 这些符号不仅仅用于演示目的。所以,例如:

App.exe < file1 >> file2

答案 1 :(得分:5)

除了原始重定向> / >><

您也可以重定向std::cinstd::cout

如下:

int main()
{
    // Save original std::cin, std::cout
    std::streambuf *coutbuf = std::cout.rdbuf();
    std::streambuf *cinbuf = std::cin.rdbuf(); 

    std::ofstream out("outfile.txt");
    std::ifstream in("infile.txt");

    //Read from infile.txt using std::cin
    std::cin.rdbuf(in.rdbuf());

    //Write to outfile.txt through std::cout 
    std::cout.rdbuf(out.rdbuf());   

    std::string test;
    std::cin >> test;           //from infile.txt
    std::cout << test << "  "; //to outfile.txt

    //Restore back.
    std::cin.rdbuf(cinbuf);   
    std::cout.rdbuf(coutbuf); 

}

答案 2 :(得分:0)

[我只是在解释问题中使用的命令行参数]

您可以将文件名作为命令行输入提供给可执行文件,但是您需要在代码中打开它们。

您提供了两个命令行参数,即inputfile&amp; OUTPUTFILE

[App.exe inputfile outputfile]

现在在你的代码中

#include<iostream>
#include<fstream>
#include<string>

int main(int argc, char * argv[])
{
   //argv[0] := A.exe
   //argv[1] := inputFile
   //argv[2] := outputFile

   std::ifstream vInFile(argv[1],std::ios::in); 
   // notice I have given first command line argument as file name

   std::ofstream vOutFile(argv[2],std::ios::out | std::ios::app);
   // notice I have given second command line argument as file name

   if (vInFile.is_open())
   {
     std::string line;

     getline (vInFile,line); //Fixing it as per the comment made by MSalters

     while ( vInFile.good() )
     {
         vOutFile << line << std::endl;
         getline (vInFile,line);          
     }
     vInFile.close();
     vOutFile.close();
  }

  else std::cout << "Unable to open file";

  return 0;
}

答案 3 :(得分:0)

理解重定向的概念很重要。重定向会重新路由标准输入,标准输出和标准错误。

常见的重定向命令为:

  • dump-xml将命令的标准输出重定向到文件,覆盖先前的内容。

    >

  • $ command > file将命令的标准输出重定向到文件,将新内容附加到旧内容。

    >>

  • $ command >> file将标准输入重定向到命令。

    <

  • $ command < file将命令的标准输出重定向到另一个命令。

    |

  • $ command | another_command将标准错误重定向到文件。

    2>

    $ command 2> file

  • $ command > out_file 2> error_file将stderr重定向到与stdout重定向到的文件相同的文件。

    2>&1

您可以结合重定向:

$ command > file 2>&1

即使这不是您的问题的一部分,当与重定向命令结合使用时,您还可以使用功能强大的其他命令:

  • sort:按字母顺序对文本行进行排序。
  • uniq:过滤重复的相邻文本行。
  • grep:搜索文本模式并输出。
  • sed:搜索文本模式,对其进行修改并输出。