Перенаправление ввода C ++, вызывающее ошибку при работе аргументов файла - PullRequest
0 голосов
/ 24 апреля 2019

Когда я указываю входной файл в качестве аргумента файла, например:

./asm ex1_in

все работает как надо!

Однако, когда я указываю входной файл с помощью перенаправления, кактак:

./asm < ex1_in

программа выдает ошибку, которую она должна выдать, если входной файл поврежден или не существует.

Это часть кода, которая обрабатывает ввод иаргументы файла:

int main(int argc, char * argv []) {
    ifstream InFile(argv[1], ios::in); 

    if (!(InFile.is_open())) {  /* check file */
        fprintf (stderr, "The input file cannot be open or cannot be read. \n");
        return 2;
    }                

    if (InFile.is_open()) {
        //some stuff
        InFile.close();     
    }   

    //other stuff
}

Я хотел бы иметь возможность продолжать использовать ifstream, так как это очень полезно для остальной части программы.

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

РЕДАКТИРОВАТЬ: я добавил строку в main, чтобы попытаться увидеть, что происходит, и похоже, что при использовании перенаправления ввода программа не видит argv [1] или что-либо после него.

cout << argv[0] << " " << argv[1] << " " << argv[2];

распечатывает только ./asm.

Когда перенаправление ввода не используется, распечатывается:

./asm ex1_in my1_out

1 Ответ

1 голос
/ 24 апреля 2019

Вы пытаетесь открыть argv[1] как файл каждый раз, когда запускаете программу.

В первом случае argv имеет длину два (имя исполняемого файла)и имя файла), поэтому он открывается и делает то, что ему нужно, как обычно, но когда вы запускаете его, перенаправляя файл на стандартный ввод, argv просто содержит имя исполняемого файла, а поскольку argv[1] является строкой в ​​стиле C, онбудет читать все, пока не найдет нулевой байт, затем передаст все, что прочитало, конструктору std::ifstream, каждый раз терпя неудачу.

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

...