Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с чтением из файла 
:(
    Опции темы
daffdaff
Дата 11.5.2009, 19:12 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.5.2009

Репутация: нет
Всего: нет



Доброго времени суток!!! Возникла необходимость прочитать данные из файла вида :

69    0    20736    49763    64    64    47    58380    19179712    -2044417856
69
вAU4Pзnі,X‚d€q€q№у №eяЮ5©…`v_л°б{$BлђEHFCEPFFFACACACACACACABN
69    0    22272    29864    0    128    47    11208    -2044417856    19179712
69
#Ес'жцОСЅИ”:R4vмЩКџVЯOtvпж& аb26Ћ§CЯІOљcKWFCEPFFFACACACACACACABN
69    0    19968    17318    0    128    17    4293    -81418048    -14178112
33
 EOEBEEEOEBEEFKFKFKCOEJEOEGEPCAAA
69    0    19712    50275    64    64    47    58892    19179712    -2044417856
69
нЧ©dиvL¶№kGЇЄє*CfН^И3 Dꉘ„# ы/ZЮйВЏCЯІOљcKWFCEPFFFACACACACACACABN
69    0    19968    272    0    128    17    22361    -148395840    -14178112
33
 FEEJENEFCOEBFAFAEMEFCOEDEPENCAAA
69    0    19968    16660    0    128    17    47707    1411688640    -14374720

первую строку считываю printf-ом
во второй строке находится длинна следующей строки
А проблема сообственно в том? как прочитать данные после(там может быть произвольное число строк)!!! Буду благодарен за помощ, ибо я себе уже весь мозг сломал(((

PM MAIL   Вверх
azesmcar
Дата 12.5.2009, 08:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(daffdaff @  11.5.2009,  19:12 Найти цитируемый пост)
первую строку считываю printf-ом

читаешь из файла printf-ом? наверное это специфический юмор который я не пойму.
и вместо того чтобы постить сюда содержимое файла, лучше убери и покажи код и расскажи о структуре файла.


Это сообщение отредактировал(а) azesmcar - 12.5.2009, 08:58
PM   Вверх
zim22
Дата 12.5.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(daffdaff @  11.5.2009,  19:12 Найти цитируемый пост)
(там может быть произвольное число строк)

Код

std::ifstream in("file.txt");
std::string str;
while (getline(in, str)) { // считывать "произвольное число строк"
}



--------------------
PM MAIL   Вверх
daffdaff
Дата 12.5.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.5.2009

Репутация: нет
Всего: нет



Ну извени, ошибся - не printf, а fscanf - с кем не бывает?

В файле записаны ip-пакеты :

1 - ая строка это ip-заголовок пакета в 10-тичном виде
Код

typedef struct IPHeader
{
        UCHAR iph_verlen; // версия и длина заголовка
        UCHAR iph_tos; // тип сервиса
        USHORT iph_length; // длина всего пакета
        USHORT iph_id; // Идентификация
        USHORT iph_offset; // флаги и смещения
        UCHAR iph_ttl; // время жизни пакета
        UCHAR iph_protocol; // протокол
        USHORT iph_xsum; // контрольная сумма
        ULONG iph_src; // IP-адрес отправителя
        ULONG iph_dest; // IP-адрес назначения
}IPHeader;


2-ая строка это длинна поля данных пакета
3-я это собственно сами данные 
далее всё по новой

Читаю таким образом :

Код

        IP_dg *ip_data;
        IPHeader ip;
        char data[65536];
        String data2;
        FILE *f;
        int count, len;

        IP_open.clear();
        //OpenDialog1->Filter = "Файлы проекта|.txt";
        OpenDialog1->Execute();

        f = fopen((OpenDialog1->FileName).c_str(), "r");
        if( !f )
                return;
        Mod_StringGrid->RowCount = 1;

        fscanf(f, "%d", &count);

        for(int i = 0; i < count; i++)
        {
               fscanf(f,"%d\t", &ip.iph_verlen);
               fscanf(f,"%d\t", &ip.iph_tos);
               fscanf(f,"%d\t", &ip.iph_length);
               fscanf(f,"%d\t", &ip.iph_id);
               fscanf(f,"%d\t", &ip.iph_offset);
               fscanf(f,"%d\t", &ip.iph_ttl);
               fscanf(f,"%d\t", &ip.iph_protocol);
               fscanf(f,"%d\t", &ip.iph_xsum);
               fscanf(f,"%d\t", &ip.iph_src);
               fscanf(f,"%d\n", &ip.iph_dest);

               fscanf(f,"%d\n", &len);
               fread(data, len, sizeof(char), f);
        }

        fclose(f);
        show();

PM MAIL   Вверх
azesmcar
Дата 12.5.2009, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(daffdaff @  12.5.2009,  18:00 Найти цитируемый пост)
Ну извени, ошибся - не printf, а fscanf - с кем не бывает?

А есть люди которые и вправду так делают..так что вопрос вполне к месту smile 


Цитата(daffdaff @  12.5.2009,  18:00 Найти цитируемый пост)

2-ая строка это длинна поля данных пакета
3-я это собственно сами данные 
далее всё по новой

Читаю таким образом :

пока сильно не вдаюсь в подробности кода, первый вопрос как только вижу код.
#pragma pack(1) стоит?
какое выравнивание структур?

Цитата(daffdaff @  12.5.2009,  18:00 Найти цитируемый пост)
В файле записаны ip-пакеты :

еще, если это dump от библиотеки libpcap - у него свои средства есть для чтения своего dump-a. Так, на всякий случай
PM   Вверх
daffdaff
Дата 12.5.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.5.2009

Репутация: нет
Всего: нет



Записываю в файл таким образом :

Код

        for(iter_ip = IP_full.begin(); iter_ip != IP_full.end(); iter_ip++)
        {
               ip = iter_ip->iph;
               data = iter_ip->data;

               fprintf(f,"%d\t", ip.iph_verlen);
               fprintf(f,"%d\t", ip.iph_tos);
               fprintf(f,"%d\t", ip.iph_length);
               fprintf(f,"%d\t", ip.iph_id);
               fprintf(f,"%d\t", ip.iph_offset);
               fprintf(f,"%d\t", ip.iph_ttl);
               fprintf(f,"%d\t", ip.iph_protocol);
               fprintf(f,"%d\t", ip.iph_xsum);
               fprintf(f,"%d\t", ip.iph_src);
               fprintf(f,"%d\n", ip.iph_dest);

               //fprintf(f,"%d\n", data.Length());
               //fprintf(f,"%s\n", data);
        }


А для чего #pragma pack(1) ?
PM MAIL   Вверх
azesmcar
Дата 13.5.2009, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



daffdaff
а зачем так читать и писать если есть структура?

смени обявление структуры на
Код

#pragma pack(push)
#pragma pack(1)

typedef struct IPHeader
{
    UCHAR iph_verlen; // версия и длина заголовка
    UCHAR iph_tos; // тип сервиса
    USHORT iph_length; // длина всего пакета
    USHORT iph_id; // Идентификация
    USHORT iph_offset; // флаги и смещения
    UCHAR iph_ttl; // время жизни пакета
    UCHAR iph_protocol; // протокол
    USHORT iph_xsum; // контрольная сумма
    ULONG iph_src; // IP-адрес отправителя
    ULONG iph_dest; // IP-адрес назначения
}IPHeader;

#pragma pack(pop)

вот тут почитай про выравнивание структур
http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx

дальше, читай сразу через fread и пиши через fwrite, или потоко используй.
если не получится скинь куда нибудь пример файла который читаешь.

Добавлено через 6 минут и 47 секунд
что-то вроде этого будет
Код

    std::vector<ip_header> ips;
       //заполняем вектор...
    std::ofstream fs("output.bin", std::ostream::binary);
    for (std::vector<ip_header>::const_iterator it = ips.begin(); it != ips.end(); ++it)
    {
        fs.write((char*)(&(*it)), sizeof(ip_header));
    }


PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.