Различия в чтении файла с использованием ifstream в g++ и msvc
При использовании класса ifstream для чтения слов из входного файла я использовал следующее выражение:
#include <iostream>
#include <fstream>
int main(int argc, char *argv[])
{
std::ifstream inputStream(myFile.txt);
std::string myString;
myFile.open()
while(myFile.good())
{
myFile >> myString;
printf("%s \n", myString);
}
return 0;
}
Содержимое файла myFile.txt: "Это простая программа".
Компилируется и выполняется, как ожидается, используя компилятор g++.
Однако тот же код при компиляции с использованием msvc 2008 возвращает ошибку в операторе извлечения (>>), требующую от меня заменить std::string либо инициализированным массивом символов, либо любым из поддерживаемых собственных типов.
Это отбросило меня, так как я ожидал, что использование стандартной библиотеки будет одинаковым в разных реализациях.
Я понимаю ошибку компиляции и знаю способ ее исправить с помощью c_str().
Но мне бы очень помогло, если бы кто-то мог объяснить, почему использование стандартной библиотеки различается на разных платформах.
Для меня это больше не является стандартом!!
РЕДАКТИРОВАТЬ: Код обновлен для завершения. Содержимое myFile.txt обновлено.
2 ответа
Скорее всего, вы забыли #include <string>
, Без этого версия Microsoft <iostream>
(и такие) включают достаточно декларации std::string
для некоторых вещей работать, но другие части отсутствуют, поэтому вы получаете странные, казалось бы необъяснимые сбои.
Одна из вещей, которые не хватает, это большинство перегрузок операторов для std::string
, который именно то, что вы, кажется, упускаете.
Как в сторону, while (myfile.good()) ...
в значительной степени гарантированная ошибка - вы, вероятно, хотите:
while (myfile>>myString)
std::cout << myString << " \n";
В качестве альтернативы, вы можете сделать работу с помощью стандартного алгоритма:
#include <string>
#include <algorithm>
#include <iterator>
#include <fstream>
#include <iostream>
int main() {
std::ifstream myfile("input.txt");
std::copy(std::istream_iterator<std::string>(myfile),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, " \n"));
return 0;
}
Следующие компиляции отлично для меня на MSVC 2010:
std:: ifstream inputStream; std:: string myString; inputStream.open ("myFile.txt", std:: ifstream:: in); в то время как (inputStream.good()) { inputStream >> myString; }
Примечание: без использования std::ifstream::in
как мой открытый режим, я получил ту же ошибку, что и вы. Я предлагаю вам проверить, какое значение у вас есть для этого параметра.