Total C ++ Noob: проблемы файлового ввода-вывода с Boost и std - PullRequest
0 голосов
/ 01 августа 2020

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

std::string line;
std::ifstream F;

int M = 0;    // Model Parameter //

if (F.open (fname)) // Error 1
    std::cout << "Parsing File...";

else {
    std::cout << "***Parsing - ERROR!***" << std::endl;
    std::cout <<"Invalid filename passed to Parsing::ReadData" << std::endl;
    std::cout << "fname = " << fname << " : Can't open file!" << std::endl;
    throw 2;
}

std::getline (F, line);

std::vector<std::string> *result;
boost::split(result, line, boost::is_any_of(":")); // Errors 2 and 3

// Read Number of Metabolites
M = std::atoi(result[1]);  // Error 4

std::cout << "M = " << M << std::endl;

F.close();

Пока что из того, что я читал в Интернете, это кажется мне довольно простым. Дайте мне знать, если я должен предоставить какие-либо разъяснения. Я получаю все эти ошибки при компиляции и выполнении:

In file included from test_parsing.cpp:11:
./Parsing_Engine.h:72:6: error: value of type 'void' is not contextually
      convertible to 'bool'
        if (F.open (fname))
            ^~~~~~~~~~~~~~
./Parsing_Engine.h:85:2: error: use of undeclared identifier 'boost'
        boost::split(result, line, boost::is_any_of(":"));
        ^
./Parsing_Engine.h:85:29: error: use of undeclared identifier 'boost'
        boost::split(result, line, boost::is_any_of(":"));
                                   ^
./Parsing_Engine.h:88:22: error: implicit instantiation of undefined template
      'std::__1::vector<std::__1::basic_string<char>,
      std::__1::allocator<std::__1::basic_string<char> > >'
        M = std::atoi(result[1]);
                            ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/iosfwd:216:28: note: 
      template is declared here
class _LIBCPP_TEMPLATE_VIS vector;

Что касается ошибки F.open, я не понимаю, почему void не интерпретируется как false. Что касается ошибок Boost, я не понимаю, почему это происходит, потому что я установил библиотеку с помощью brew. Я не понимаю, что подразумевается под неявным экземпляром результата, хотя я предполагаю, что эта ошибка исчезла бы go, если бы я мог ускорить работу.

Есть какие-нибудь советы по поводу того, что я делаю неправильно? Также извините - я не уверен, что это TMI для сообщения stackoverflow.

1 Ответ

3 голосов
/ 01 августа 2020

Тип возвращаемого значения std :: basic_fstream :: open равно void. Вы не можете использовать это как условие. false и true - значения типа bool. Вы не можете преобразовать void в bool.

Вы можете переписать эти строки как

std::string line;
std::ifstream F(fname);

if (F)
    std::cout << "Parsing File...";
else {
    std::cout << "***Parsing - ERROR!***" << std::endl;
    std::cout <<"Invalid filename passed to Parsing::ReadData" << std::endl;
    std::cout << "fname = " << fname << " : Can't open file!" << std::endl;
    throw 2;
}

Ошибки 2 и 3 могут быть вызваны отсутствием директив include. Вы должны включить заголовки повышения.

result - указатель на вектор строк. result[1] эквивалентен *(result + 1), и его тип - вектор строк. std::atoi ожидает строку C как единственный параметр. Вероятно, вы хотите, чтобы

std::vector<std::string> result;
boost::split(result, line, boost::is_any_of(":"));

// Read Number of Metabolites
M = std::stoi(result[1]);

std::stoi принимает std::string и преобразует его в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...