читать текстовый файл в массив типа объекта класса (C ++) - PullRequest
0 голосов
/ 01 апреля 2009

Итак, у меня есть тип объекта класса, myClass classType как глобальный. что не случается так, что предпочел бы иметь

// MyClass.h
{
  private:
    char FirstName;
    char LastName;
    char MiddleName;
    int ID;
    int Age;
};

// Globals
const int myIndex = 256;
myClass classType[ myIndex ];

int main()
{

   // assume preprocessors are included

   cout << "Enter File: ";
   cin  >> cArray;
   if ( !inFile.good() ) 
   {
     cout << "Wrong?" << endl;
   }
   inFile.open( cArray );
   while ( !inFile.eof() )
   {
     linecount++ // giving me 1 and not counting the file lines

 inFile.read( ( char * ) &myType[linecount], sizeof( myClass ) );

   }
}

Это грубое представление о том, как выглядит главное для меня сегодня. Я еще не использовал myClass.cpp! Мой текстовый файл имеет этот формат:

FirstName Фамилия Идентификационный номер Возраст ...

После отладки я заметил, что символ новой строки не был обнаружен, и теперь все в BUNCHED, по тому же индексу! Как мой инкремент не работал или что-то ..

Я хотел увеличить число строк в файле. ( больше одного ) Я пытаюсь исправить linecount (idx) в надежде полностью решить эту проблему.

Мои личные участники, FirstName LastName и т. Д., Как я писал выше, присутствуют при отладке и перетаскивании myclasstype. Мне просто нужно, чтобы получить их с надлежащим varaible. Я просто надеюсь, что функция ifstream :: read () не приведет меня в неправильном направлении.

Есть предложения?

Ответы [ 4 ]

1 голос
/ 20 апреля 2009
// MyClass.h
{
  private:
    char FirstName;
    char LastName;
    char MiddleName;
    int ID;
    int Age;
};

Что это за структура / класс? Я думаю, что это мой класс. В любом случае myClass не имеет смысла имени.

  1. FirstName / LastName / MiddleName eighter являются инициалами - что означает, что имя неверно - или неправильно набраны. То, что вы ищете, это eighter std :: string или char *.
  2. Традиционно ID - это первое поле, если оно необходимо.

``

// Globals
const int myIndex = 256;
myClass classType[ myIndex ];

Как правило - никогда не используйте глобалы. У вас будут проблемы.

int main()
{

   // assume preprocessors are included

   cout << "Enter File: ";
   cin  >> cArray;

Что такое cArray?

   if ( !inFile.good() ) 

Где определяется inFile? Почему вы проверяете состояние ввода-вывода перед любой операцией ввода-вывода в этом потоке?

   {
     cout << "Wrong?" << endl;
   }
   inFile.open( cArray );

Хорошо. Не проще написать ifstream inFile(cArray)?

while (! InFile.eof ()) { linecount ++ // давая мне 1 и не считая строки файла

Вы просите переполнения. Что если в файле больше 256 строк? Какая наихудшая программа не потерпит крах - она, скорее всего, напишет в каком-то неуказанном месте.

 inFile.read( ( char * ) &myType[linecount], sizeof( myClass ) );
  1. Никогда не используйте двоичные форматы, если нет необходимости. Их очень сложно отлаживать. Если у вас хороший, простой текстовый формат, все, что вам нужно протестировать, это текстовый редактор для редактирования тестовых входных файлов. С бинарным у вас нет гарантии, что ошибка в программе, а не в тестовом примере.
  2. Everné, если вы делаете используете двоичный формат, делайте не читайте его таким образом. На самом деле у вас нет возможности определить, не изменил ли компилятор смещения. Например, ID обычно будет иметь смещение 4 байта. Но компилятор может оптимизировать его.

    Кроме того, вы не можете определить размер ID и Age, за исключением того, что они больше, чем 2 байта. Обычно они равны 4, но на некоторых 64-битных компиляторах (ИМХО такой способ верен там, где int == одно слово) это может быть 8. В будущем это может быть 16 (если будет 128-битные компьютеры). Вы можете думать, что никогда не будет, но в то же время «768 К было достаточно для всех» (это было много в те дни).

Если вы попытаетесь прочитать текст таким образом

   }
}

Если вам не нужно проверять ввод (в таком случае iostreams - не лучший инструмент):

class person
{
public:
  person (const std::string &first_name,
          const std::string &last_name,
          const std::string &middle_name,
          int                id,
          int                age)
          : m_first_name(first_name),
            m_last_name(last_name),
            m_middle_name(middle_name,
            m_id(id),
            m_age(age) {}
private:
  std::string m_first_name, m_last_name, m_middle_name;
  int m_id, m_age;
};
// Lots of other code
std::vector<person> people;
while(...)
  {
    std::string first_name, last_name, middle_name;
    int id, age;
    in_file >> first_name >> last_name >> middle_name >> id >> age;
    person p(first_name, last_name, middle_name, id, age);
    people.push_back(p);
  }

Его можно сократить и заполнить, но: 1. Используйте хорошие функции C ++, такие как STL (вам не нужно запоминать индекс или вам не нужно беспокоиться о переполнении вектора) 2. Использует текстовый формат

0 голосов
/ 01 апреля 2009

Несколько баллов;

  • что такое cArray?
  • вы должны проверить, что файл открыт с помощью is_open ()
  • функция eof () обнаружит только конец файла ПОСЛЕ того, как вы что-то прочитали
  • вы должны использовать std :: getline () для чтения строк
  • как было указано в комментарии, имена в вашем классе - это одиночные символы, они должны быть std :: strings
0 голосов
/ 01 апреля 2009

Ваш подход с чтением (buf, size) не будет работать, если ваши данные поступают из текстового файла. Он заполнит buf любыми байтами, считанными из ввода. Вы не можете «заполнить» объект где-то в памяти таким образом. read (buf, size) работает только с двоичными данными.

Я бы перегрузил оператор потока >>, чтобы выполнить фактический анализ текстовых данных. Вывод будет сохранен в объекте, переданном в качестве ссылки:

istream& operator>> (istream& in, MyClass& val );

0 голосов
/ 01 апреля 2009
  • Я рекомендовал использовать boost :: serialization для тех же целей.
  • Почему вы увеличиваете количество строк перед чтением строки? Вы оставляете первый элемент myType неинициализированным.
  • Если вы используете формат текстового файла, почему вы используете функцию чтения?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...