когда будет установлен failbit при выполнении вызова функции getline в c ++ - PullRequest
0 голосов
/ 14 июля 2011

когда произойдет сбой getline в c ++?

У меня есть большой фрагмент кода, который я не могу вставить полностью по разным причинам.Я пытаюсь прочитать из файла, который, как я знаю, существует и содержит данные, используя getline в C ++.Но getline не может вернуть ошибку 123 - неверное имя (вывод getlasterror).Я посмотрел код ошибки, который сбивает меня с толку.

Я проверяю ошибки при открытии файла.Так что я уверен, что у меня есть дескриптор файла.Пожалуйста, потерпите меня, чтобы не вставлять код.Я новичок в C ++ и особенно в Windows.Любые предложения или идеи о getline помогут.Я пытаюсь прочитать файл, который выгружается компилятором.

Это выдержка из кода

ifstream inFile("C:\...\ash.txt",ios::in);

string singleLine;

getline(inFile,singleLine);

singleLine пусто!Я делаю что-то глупое .. Пожалуйста, укажите мне это!цените это

ВАЖНОЕ РЕДАКТИРОВАНИЕ:

Я проверил наличие элементов ios и обнаружил, что бит сбоя установлен.Почему бит сбоя должен быть установлен?файл действительно существует, и мне также было интересно, может ли проблема вызывать то, как Windows предоставляет расширения файлов.Это не похоже на проблему.Чего мне не хватает?

Ответы [ 5 ]

4 голосов
/ 14 июля 2011

GetLastError сообщает вам только о вызовах Win32 API, которых std::getline нет.

Проверьте членов iostream, которые потерпели неудачу, например, rdstate().

Вызов ios::exceptions(eofbit | failbit | badbit) до getline и перехват результирующего исключения может привести к более информативному сообщению об ошибке.

1 голос
/ 14 июля 2011

Если установлен бит fail, возможно, это связано с тем, что вы не открыли файл успешно.Проверьте, возвращает ли ifFile.is_open() true;если нет, то, вероятно, указывает, что файл открыт неправильно.Возможно, у вас нет прав доступа, или вам может потребоваться правильно экранировать строку, или файл может быть заблокирован.

Вам также следует проверить, установлено ли fail до и после вызова getline.Если это раньше, это, вероятно, означает, что файл не открыт.Если это после, это может означать, что файл пуст.

Возможно, Windows скрывает истинное расширение файла от вас.Имя файла может фактически называться ash.txt.txt, например, если у вас есть проводник, настроенный на скрытие расширений файлов.Это может стоить изучить, если файл не открыт.

0 голосов
/ 14 июля 2011

Не удалось открыть файл.

Это потому, что вы не указали правильный путь.

Это потому, что вы использовали древнее соглашение Windows \ как разделитель пути.
Который также является escape-символом в C.

Именно поэтому Windows позволяет использовать / в качестве разделителя пути (и уже более десяти лет), потому что использование '/' подвержено ошибкам.

Ваш путь должен быть:

ifstream inFile("C:\\...\\ash.txt");

// Or my preference

ifstream inFile("C:/.../ash.txt");

Или даже лучше использовать повышение.

0 голосов
/ 14 июля 2011

Вам нужно избежать обратной косой черты в пути к файлу?

0 голосов
/ 14 июля 2011

Getline IIRC предназначен для c_strings, и строка является первым аргументом, а не вторым.

http://www.cplusplus.com/reference/iostream/istream/getline/

Вы пытаетесь использовать нормальную строку, которая (я мог быошибаться) не работает с getline.

...