Отправка имени текстового файла из командной строки c ++ - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу запустить свой код и отправить файл двумя способами

  1. myprogram < input.txt или cat input.txt | myprogram
  2. myprogram input.txt

Я выяснил способ secong, используя argc и argv[], но я не могу понять, как написать код для первого варианта.

int main (int argc, char *argv[])
{
     ifstream fin;
     if(argc > 1){

        fin.open (argv[1]);
     }
     else
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Как упомянуто выше в комментарии, переносимым способом является передача либо открытого файла, либо std::cin в качестве ссылки istream на функцию и выполнение там вашего ввода. В этом случае может быть передан либо файл, либо std::cin. Э.Г.

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

void readinfo (std::istream& in)
{
    std::string s;
    while (in >> s)
        std::cout << s << '\n';
}

int main (int argc, char **argv) {

    if (argc > 1) {     /* read from file if given as argument */
        std::ifstream fin (argv[1]);
        if (fin.is_open())
            readinfo (fin);
        else {
            std::cerr << "error: file open failed.\n";
            return 1;
        }
    }
    else {  /* read from stdin */
        readinfo (std::cin);
    }

    return 0;
}

Непереносимая опция Linux only, считывающая /dev/stdin, если файл не указан, просто требуется оператор троичный , например,

    std::ifstream fin (argc > 1 ? argv[1] : "/dev/stdin");
    if (!fin.is_open()) {
        std::cerr << "error: file open failed.\n";
        return 1;
    }
    /* read from fin here */

Ни один из них не является полностью элегантным, но оба поддерживают (в зависимости от ограничений ОС)

myprogram < input.txt

или

myprogram input.txt
0 голосов
/ 06 ноября 2018

Вы хотите читать со стандартного ввода, и для этого есть 2 варианта:

  • std::cin
  • fread() и другие C-style IO

std::cin >> https://en.cppreference.com/w/cpp/io/cin имеет преимущество чтения форматированного текста в некоторое двоичное представление https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt

IO в стиле C https://en.cppreference.com/w/cpp/io/c имеет преимущество в том, что хорошо читает двоичные данные.

Это зависит от того, что вы хотите сделать с ним ваш ввод

...