g ++ Неполный тип для ifstream, правильные заголовочные файлы - PullRequest
0 голосов
/ 25 октября 2011

Доброе утро,

Я пытаюсь прочитать файл, используя C ++, скомпилированный с g ++ (g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3).Tis компилируется и работает под MSVC 2008

Мой код здесь очень урезан:

   #include <iostream>
   #include <fstream>

   int main(int argc, char* argv[]) 
   {
      const char filename[] ("~/Serial.Number")

      std::ifstream           afile       ( fileName );
       if ( afile.is_open() )
       {
          // read input
          afile.close();
       }
    }

Все, что я прочитал, говорит, что этого достаточно для работы входного файла.Когда я пишу это (повторяющиеся попытки), курсор «Eclipse» над «компилятором» говорит, что «afile» - это ifstream. Однако после того, как я скомпилирую его, снова наведя курсор на «afile», я получаю «Incomplete type ...».

Странно, когда я запускаю программу (режим отладки). Она запускается, ошибок нет, исключений нет, но файл никогда не открывается, а .is_open () - false.

Есть идеи?

Уэс

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Вероятно, в вашей системе Linux нет файла с именем ~\Serial.Number. Это не означает, что вы, вероятно, хотите (файл с именем Serial.Number в вашем домашнем каталоге).

Путь к файлу ~\Serial.Number в Linux при передаче системному вызову open или потоку файлов C ++ будет означать имя файла, начинающееся с тильды ~, за которой следует обратный слеш \, что маловероятно ( даже если это возможно в принципе) существовать.

Возможно, вы хотите извлечь домашний каталог, используя getenv("HOME"), и добавить его в строку "/Serial.Number" (начиная с обычного слэша, а не обратного слэша).

Привет.

1 голос
/ 25 октября 2011

Есть несколько проблем:

  • Если g ++ успешно компилирует код, то он (очевидно) может разрешать необходимые типы, даже если парсер Eclipse C ++ по какой-либо причине не может,Получение Eclipse для правильного разрешения типов - это отдельный вопрос.
  • Использование ~ в вашем имени файла, вероятно, не будет соответствовать вашим ожиданиям.Использование его из оболочки Unix или Linux относится к вашему домашнему каталогу, поскольку оболочка расширяет его до вашего домашнего каталога, но использование его из кода приложения относится к буквальному каталогу ~.
  • Обратный слеш - это C иC ++ escape-символ.Так что \S - это специальный символ (точно так же, как \n - это новая строка).Поскольку \S, в частности, не является escape-символами C и C ++, я удивлен, что ваш компилятор не жалуется.Вместо этого вам следует избегать обратной косой черты (то есть "~\\Serial.number") для Windows, или использовать прямую косую черту ("~/Serial.number") для Linux (которая также будет работать в Windows), или использовать кросс-платформенную библиотеку (например, Boost).Файловая система ), которая позаботится о различиях путей.
1 голос
/ 25 октября 2011

~ и \S выглядят подозрительно для меня.Как указал @wilx, это имеет смысл только для оболочки, а не для методов файлового ввода-вывода.Создайте полный путь с помощью пользовательской переменной окружения $HOME:

std::string fullpath = getenv("HOME");
fullpath += "/Serial.Number";
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...