C ++ Преобразование перенаправления ввода имени файла в новый выходной текстовый файл с добавлением .txt к имени нового выходного файла. - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь использовать перенаправление ввода для сканирования файла на наличие регулярных выражений и вывода этих регулярных выражений с номером строки файла в новый выходной текстовый файл.Выходной текстовый файл должен быть именем файла, который использовался для перенаправления ввода с добавленным к нему «.txt».Например, если программа была запущена следующим образом:

. / ScanRegex

Тогда выходной файл должен называться

scanThisFile.log.txt

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

main.cpp

    #include <iostream>
    #include <ios>
    #include <fstream>
    #include <string>
    #include <vector>

    int main( int argc, char* argv[] )
    {
       std::string fileName = argv[1]; //<---===== ??????
       std::string txt = ".txt\n";
       char outputFile[100];

       for( int i = 0; i < fileName.length(); ++i ){
         outputFile[i] = fileName[i];
       }
       for( int i = fileName.length(); i < fileName.length() + 4; ++i ){
         outputFile[i] = txt[i - fileName.length()];
       }

       std::ofstream outfile;
       outfile.open(outputFile);

       outfile << "It works!!";

       outfile.close();
    }

Когда я использую

argv [0]

программа запускается, но имя файла неверно для моего намерения, но понятно, потому что имя программы является первым аргументомдля argv: a.txt

Когда я использую

argv [1]

Я получаю следующую ошибку времени выполнения:

osboxes @ osboxes: ~ / Desktop / ps7 $ ./a

Когда я использую

argv [2]

программа запускается, но имя файла неверно aи полный бред (переполнение?):

Может быть, это только часть моей проблемы.Любая помощь будет принята с благодарностью.Спасибо.

1 Ответ

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

Вы путаете стандартный ввод с аргументами командной строки вашей программы .Аргументы командной строки - это список строк, которые вы включаете в командную строку при вызове вашей программы.Например:

$ ./myProgram arg1 arg2 ... argn

Они читаются через argv и argc, которые соответственно представляют «вектор аргумента» и «количество аргументов».По соглашению, первый аргумент - это рабочий каталог вашей программы.В этом примере у вас будет:

argv == {"/path/to/myProgram", "arg1", "arg2", ..., "argn"}
argc == n

в начале main.Вы должны быть осторожны, чтобы не читать из argv за пределами, проверяя argc, как с любым необработанным массивом.

Стандартный ввод , с другой стороны, является потока данных, которые поступают в вашу программу на протяжении вызова main.Это читается с использованием std::cin.

int main(int argc, char** argv){
    std::string s;
    std::cin >> s; // read from standard input
}

Когда вы запустите эту программу, она будет блокироваться в указанной строке, пока не получит данные со стандартного ввода.Эти данные можно ввести, набрав вручную во время работы программы из командной строки:

$ ./myProgram

hello

илиперенаправление ввода:

$ echo "hello" | ./myProgram

$ ./myProgram < hello.txt

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

Обратите внимание, что std::cin >> s будет читать текст, пока не достигнет первого символа пробела.К счастью, есть простые способы прочитать всю строку из stdin и прочитать все из stdin

...