2017-02-20 51 views
0

Я хочу, чтобы иметь возможность читать текстовые файлы из командной строки, но моя программа не компилируется. Кто-нибудь знает, что я делаю неправильно?Аргумент командной строки для чтения текстового файла

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

Так что Я пытаюсь сделать это

1) ./a.out menu1.txt menu2.txt

И позволить пользователю выбрать, сколько файлов они хотят читать, так это может быть также

2) ./a.out menu1.txt menu2.txt menu3.txt, как это сделать?

menu1.txt 
hamburger 5.00 
pizza 3.25 
chips 2.50 

menu2.txt 
hamburger 2.00 
pizza 2.35 
chips 1.50 

menu3.txt 
hamburger 4.00 
pizza 5.35 
chips 0.50 

Это то, что я до сих пор:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

int main(int argc, char* argv[]){ 
    ifstream inStream; 
    ofstream outStream; 
    for(int i=1; i <= argc; i++) 
    // i=1, assuming files arguments are right after the executable 
    { 
     string fn = argv[i]; //filename 
     cout << fn; 
     fstream f; 
     f.open(fn); 


     //inStream.open("menu1.txt"); 
     // inStream.open("menu2.txt"); 
     string item[10]; 
     double cost[10]; 


     // ifstream m1("menu1.txt"); 
     //ifstream m2("menu2.txt"); 


     string name; 
     double var; 

     string line; 
     istringstream iss(line); 

     short loop=0; 
     if(f.is_open()){ 

      while(!f.eof()){ 
       iss >> name >> var; 
       getline(f, line); 
       while(f>>name>>var){ 
        item[loop]=name; 
        cost[loop]=var; 
        cout << "Item at index " << loop << " " << item[loop]<<endl; 
        cout << "Cost at index " << loop << " " << cost[loop]<<endl; 
        loop++; 
       } 

      } 

     f.close(); 
     } 


    } 


    return 0; 

} 

Это сообщение об ошибке при попытке компиляции:

 p3.cpp: In function ‘int main(int, char**)’: 
    p3.cpp:17:25: error: no matching function for call to  ‘std::basic_ifstream<char>::open(std::string&)’ 
     inStream.open(fn); 
         ^
p3.cpp:17:25: note: candidate is: 
In file included from p3.cpp:1:0: 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/fstream:541:7: note: void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode] 
     open(const char* __s, ios_base::openmode __mode = ios_base::in) 
    ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.9.3/include/g++-v4/fstream:541:7: note: no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const char*’ 
+4

Какова ваша конкретная проблема? –

+0

Он пытается заставить пользователя ввести столько файлов, сколько аргументов в программу. Например. пользователь может указать 2 файла, 3 файла или что угодно. –

+0

Я пытаюсь получить команду, как принять файлы menu.txt, и прочитать их и поместить в массив, но я не знаю, как его прочитать из командной строки – user5999727

ответ

1

конвертировании argv[i] к string, который не является обязательный. Вы можете сделать это вместо этого.

const char *fn = argv[i]; 
// other code  
f.open(fn); 

fstream::open принимает const char* filename аргумент.

+0

Спасибо вам большое! Это сработало! – user5999727

2

Вы пытаетесь передать имя файла в виде строки в fstream :: открыт который только принимает

open(const char* __s, ios_base::openmode __mode = ios_base::in) 

в качестве аргумента, что ваш компилятор пытается сказать вам. Это означает, что указатель на массив символов. Поэтому было бы лучше разобрать arguemtns как таковой:

const char * fn = argv[i] 

Другим способом было бы включить ++ 11 поддержки с, потому что с чем открытый метод также принимает зЬй :: строку в качестве аргумента: http://www.cplusplus.com/reference/fstream/fstream/open/

Можно также преобразовать строку в строку с стиля и вызова функции:

f.open(fn.c_str()); 

и как еще один совет, пожалуйста, не используйте:

using namespace std; 

как это может привести к ужасным проблемам.

+0

Версия текущего стандарта также принимает 'const std :: string &' .argument. –

+0

Просто протестировал его, и он не работает без поддержки C++ 11. cppreference и cplusplus согласны с этим. Вы имеете в виду эти новые/новейшие стандарты? – Aeonos

+0

C++ 11 - это текущий стандарт, да. –

0

Вот решение.

#include <fstream> 
#include <iostream> 
#include <string> 
#include <sstream> 
using namespace std; 

int main(int argc, char* argv[]){ 
ifstream inStream; 
ofstream outStream; 
for(int i=1; i < argc; i++){ 
    cout << endl << argv[i]; 
    fstream f; 
    f.open(argv[i]); 


    //inStream.open("menu1.txt"); 
    // inStream.open("menu2.txt"); 
    string item[10]; 
    double cost[10]; 


    // ifstream m1("menu1.txt"); 
    //ifstream m2("menu2.txt"); 


    string name; 
    double var; 

    string line; 
    istringstream iss(line); 

    short loop=0; 
    if(f.is_open()){ 

     while(!f.eof()){ 
      iss >> name >> var; 
      getline(f, line); 
      while(f>>name>>var){ 
       item[loop]=name; 
       cost[loop]=var; 
       cout << endl << "Item at index " << loop << " " << item[loop]; 
       cout << endl << "Cost at index " << loop << " " << cost[loop]; 
       loop++; 
      } 

     } 
     cout << endl; 

    f.close(); 
    } 


} 


return 0; 
}