Различия в чтении файла с использованием 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 как мой открытый режим, я получил ту же ошибку, что и вы. Я предлагаю вам проверить, какое значение у вас есть для этого параметра.

Другие вопросы по тегам