Передача имени файла из стандартного ввода в linux в переполнение стека

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

cat fileName | executable

Я хочу иметь возможность прочитать имя файла в код C ++. У меня уже есть код, который получает доступ к строкам и читает файл, он просто получает fileName из стандартного ввода.

Есть ли строка кода или функция для чтения fileName в программе на c ++ и сохранения ее в виде строки? В настоящее время я использую приведенный ниже код для чтения каждой строки текстового файла.

ifstream myfile;
myfile.open(fileName.c_str());

if( myfile.is_open() )
{
while ( getline (myfile ,line) )
{
......
}
}

0

Решение

Все, что вам нужно сделать, это прочитать из stdin переменную (например, «fname»):

int main () {
string fname;
cin >> fname
ifstream myfile;
myfile.open (fname);
if (myfile.is_open() ) {
while ( getline (myfile, line) ) {
...

Для размещения или «передать имя» или «использовать argc / argv» (как делают многие команды * nix):

int main (int argc, char *argv[]) {
string fname;
if (argc == 1) {
cin >> fname
}
else {
fname = argv[1];
}
ifstream myfile;
myfile.open (fname);
if (myfile.is_open() ) {
while ( getline (myfile, line) ) {
...
1

Другие решения

Когда вы делаете cat filename | executable Вы отправляете не имя файла в свой исполняемый файл, а его содержимое. Если вы хотите отправить имя, используйте echo filename | executable или же executable filename, Тогда вы можете обработать argc а также argv как обычно, и выполните обычное чтение файла, которое вы показываете в своем примере кода.

2

Вы на самом деле неясно, если вы хотите прочитать файл из std::cin как это будет предоставлено

cat filename | executable

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

Скорее всего, вы хотите иметь необязательный параметр командной строки (передается в int main(int argc, char* argv[])), и ваш код чтения полагаться на std::istream входной источник, а не std::cin или же std::ifstream жёстко.

1
По вопросам рекламы [email protected]