Ошибка чтения файла, загруженного с помощью ifstream - PullRequest
2 голосов
/ 25 декабря 2010
void bot_manager_item::create_games()
{
    games.clear();
    std::ifstream paths_in("C:\\Users\\bill hank\\Documents\\bot_plugins\\directory_listing.txt", std::ios::in);
    while (paths_in.good())
    {
        send_message("The path was good.");
        char q[5000];
        paths_in.getline(q, 5000);
        send_message(q);
        games.push_back(qanda(q));
    }
    paths_in.close();
}

Файл, который я загружаю, существует, что еще может быть не так? paths_in.good не работает.

Редактировать: я понял это. Ух ты меня раздражает ответ на это. В основном Windows позволяет вам сказать, хотите ли вы показать расширения файлов или нет. В этой установке Windows указано, что расширение не должно отображаться. Поэтому, когда я проверяю файл снова и снова, я вижу: directory.txt и думаю, что это означает, что с каталогом все в порядке, хотя на самом деле имя файла было directory.txt.txt

Ответы [ 2 ]

3 голосов
/ 25 декабря 2010

Если paths_in.good() продолжает сбой, это означает, что установлены некоторые флаги ошибок потока (badbit, eofbit или failbit).

  • eofbit - конецдостигнут файл
  • badbit - приведена ошибка с буфером потока, такая как нехватка памяти или исключение внутри буфера потока
  • failbit - достигнута некоторая другая ошибка, кроме eof

Чтобы выяснить, что произошло, вам нужно сначала проверить, какой бит ошибки установлен, а затем узнать больше о конкретной ошибке и ее причинах.

1 голос
/ 26 декабря 2010

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

void bot_manager_item::create_games() {
    std::ifstream paths_in("C:\\Users\\bill hank\\Documents\\bot_plugins\\directory_listing.txt");

    char q[5000];
    while (paths_in.getline(q, 5000)) {
        std::cout << q << std::endl;
    }
}

Этот код делает несколько незначительных вещей по-другому.

  1. std::ios::in не нужно явно указывать для std::ifstream.

  2. он не использует is_good, хотя это должно быть хорошо, вы можете просто обращаться с std::ifstream как с булом, который будет true, когда он находится в хорошем состоянии.

  3. getline () возвращает ссылку на поток, с которым он работал, поэтому вы можете просто поместить всю эту строку в условие.

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

...