Опять вопрос по теме считывая файла, но по-сложнее!

Модераторы: Romeo, Hawk, Absurd, WinMain, DeeJayC

Ответить
Dude
Сообщения: 3
Зарегистрирован: 26 мар 2005, 20:28
Откуда: Казань
Контактная информация:

Опять вопрос по теме считывая файла, но по-сложнее!

Сообщение Dude » 07 апр 2005, 22:29

вот есть в текстовом файле содержится таблица, столбцы разделены символами табуляции. Первый столбец содержит цифры, т.е. значения типа integer, остальные любые, например char.... В принципе вообще нужно считать и записать по массивам. Вопрос как записать нужные значения в нужные массивы???

Tima
Сообщения: 43
Зарегистрирован: 23 сен 2004, 10:17
Откуда: Харьков
Контактная информация:

Сообщение Tima » 08 апр 2005, 10:34

Вообще то достаточно не удобный способ хранения инфы. Что по другому совсем никак?
Если никак - то придумывай свой парсер, типа
получитьСтроку()
распарситьСтроку()
первое значение если тип int в массив int
все последующие в массивы типа char
Проделать это в цикле

Аватара пользователя
WinMain
Сообщения: 912
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Сообщение WinMain » 08 апр 2005, 12:27

Лучше конечно разделять столбцы не табуляцией, а какими-то видимыми символами, типа точки с запятой (;), тогда меньше будет путаницы с разделителями, особенно если кто-то будет руками редактировать этот файл.
Если тебе заранее известен порядок записи данных в строке и их формат (числа целые, вещественные, строки...), то сначала определяется структура, поля которой будут соответствовать данным из строки текста...

Например, телефонный справочник:

7801798;ИВАНОВ В.П.;ул. КРАСНАЯ ПРЕСНЯ, д.14, кв.8
9126478;СИДОРОВ А.В.;ул. ПРОФСОЮЗНАЯ, д.36, кв.17
. . . . . .

Создаёшь для него структуру типа

Код: Выделить всё

typedef struct tagRECORD
{
   long Number;
   char Owner[80];
   char Address[128];
} RECORD;
Далее пишешь функцию, которая из строки получает данные и инициализирует ими поля структуры. Здесь может помочь класс потока istrstream:

Код: Выделить всё

#include <strstrea.h>

void StringToStruct(char *pszText, RECORD *lpRec)
{
   char Buff[128];
   istrstream is(pszText);
   is.getline(Buff, 15, ';');
   lpRec->Number = atol(Buff);
   is.getline(Buff, 80, ';');
   strcpy(lpRec->Owner, Buff);
   is.getline(Buff, 127);
   strcpy(lpRec->Address, Buff);
}
Ну а дальше уже организуешь построчное чтение текстового файла, вызываешь функцию StringToStruct(), передаёшь ей строку текста и указатель на структуру, которая будет принимать готовые данные...

Dude
Сообщения: 3
Зарегистрирован: 26 мар 2005, 20:28
Откуда: Казань
Контактная информация:

Сообщение Dude » 13 апр 2005, 18:42

Спасибо большое, пробую! Вопросы будут напишу ок?!

Styopa
Сообщения: 40
Зарегистрирован: 30 сен 2004, 18:22
Откуда: Севастополь
Контактная информация:

Сообщение Styopa » 20 май 2005, 20:40

Вопросы будут напишу ок?!
Мы все здесь для этого собрались, не так ли? :)
В жизни программиста всего три плюса. Из них два - в Си++, а третий - крест на его могиле.

Ответить