С++ перенаправление файлов

Для более быстрого ввода я прочитал, что вы можете сделать file-redirection и включить файл с уже установленными входами cin.

Теория должна быть использована как следующая

App.exe inputfile outputfile

Насколько я понял в книге С++ Primer, следующий код С++ [1] должен читать cin ввод из текстового файла и не должен нуждаться в каких-либо других специальных показаниях, таких как [2]

[2]

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

[1] Следующий код С++...

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

Я что-то пропустил?

Ответ 1

Чтобы использовать свой код [1], вы должны позвонить в свою программу следующим образом:

App.exe < inputfile > outputfile

Вы также можете использовать:

App.exe < inputfile >> outputfile

В этом случае вывод не будет переписываться с каждым запуском команды, но вывод будет добавлен к уже существующему файлу.

Подробнее о перенаправлении ввода и вывода в Windows вы можете найти здесь.


Обратите внимание, что символы <, > и >> должны быть введены verbatim — они предназначены не только для целей презентации в этом объяснении. Итак, например:

App.exe < file1 >> file2

Ответ 2

В дополнение к первоначальному перенаправлению >/>> и <

Вы можете перенаправить std::cin и std::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); 

}

Ответ 3

[Я просто объясняю аргумент командной строки, используемый в вопросе]

Вы можете указать имя файла в качестве ввода командной строки исполняемому файлу, но затем вам нужно открыть их в своем коде.

Как

Вы предоставили два аргумента командной строки: inputfile и 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;
}