Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с txt файлом 
V
    Опции темы
gromo
Дата 6.8.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть текстовый файл с вот таким содержимым (вместо "..." некий текст):
Цитата

...
 РАСШИРЕННАЯ ПЕЧАТЬ. Относит. время (час) =     0.000000E+00
...
...
...
      PsiAvr  PsiMax      ShAvr   ShMax
16   0.477   0.611/  67  11.474  25.426/  15
15   0.784   1.007/  67  18.031  38.975/  62
14   0.945   1.206/  32  20.567  43.627/  15
13   1.030   1.332/  31  21.372  44.921/  15
12   1.083   1.404/  31  21.650  45.262/  15
11   1.117   1.445/  52  21.804  45.422/  82
10   1.140   1.470/  31  21.937  45.624/  82
 9   1.155   1.484/  31  22.071  45.841/  82
 8   1.162   1.489/  31  22.209  46.077/  82
 7   1.162   1.485/  31  22.353  46.328/  82
 6   1.154   1.472/  31  22.501  46.599/  82
 5   1.136   1.448/  31  22.642  46.880/  82
 4   1.103   1.413/  31  22.704  47.054/  82
 3   1.042   1.350/  31  22.364  46.508/  82
 2   0.912   1.196/  31  20.419  43.007/  62
 1   0.595   0.778/  31  13.591  29.414/  15
...
итак далее 

Мне нужно выбрать значение 0.000000E+00 после РАСШИРЕННАЯ ПЕЧАТЬ. Относит. время (час) =, а также все значения после      PsiAvr  PsiMax      ShAvr   ShMax.
Пытаюсь сделать вот так:
Код

void MFCDlg::OnGetdatafromtxt() 
{
    double array[255];
    char ch;
    CString g[233];
 FILE *pFile = fopen ("file.txt","r");
while(true)
{
    if((ch=fgetc(pFile)) != EOF){

        if(fscanf(pFile, "РАСШИРЕННАЯ ПЕЧАТЬ. Относит. время (час) =%s\n", g[0]) && fscanf(
pFile, "%s   %s   %s\/  %s  %s  %s\/  %s\n", g[1], g[2], g[3], g[4], g[5], g[6], g[7]))
                {
//далее работаем с массивом "g"
                }
    }
    else break;
}
fclose (pFile);
}

но не получается.
Помогите, пожалуйста, решить эту задачу

Это сообщение отредактировал(а) gromo - 25.12.2011, 21:41
PM MAIL   Вверх
borisbn
Дата 6.8.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(gromo @  6.8.2011,  10:34 Найти цитируемый пост)
но не получается.

ещё бы. fscanf при нахождении %s в форматной строке ждёт, что ему дадут указатель на char в качестве параметра, который нужно заполнять, а он получает... класс CString. Разницу чуешь ?
В общем см. в сторону регулярных выражений (хз. есть ли они в MFC, в boost - точно есть)

Добавлено через 11 минут и 28 секунд
Алгоритм должен быть примерно следующий (псевдокод)
Код

const int MAX_STR_LEN = 1024;
char str[ MAX_STR_LEN ];

FILE *pFile = fopen ( "file.txt", "rt" );
if ( pFile == 0 ) {
    return false;
}
while ( ! feof( pFile ) ) {
    if ( gets( str, MAX_STR_LEN, pFile ) != 0 ) {
        reg_ex reg_1 = ( "РАСШИРЕННАЯ ПЕЧАТЬ. Относит. время (час) = (.*)" );
        reg_ex reg_2 = ( "(\\d+)   (\\d+.\\d)   (\\d+.\\d)/  (\\d+)  (\\d+.\\d)  (\\d+.\\d)/  (\\d+)" );
        // если строка подходит под reg_1, то вытащить из него строку с 000E+00
        // иначе, если строка подходит под reg_2, то вытащить из него все числа и сделать с ними то, что нужно
    }
}
fclose( pFile );



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
gromo
Дата 6.8.2011, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



borisbn, отличная идея, но раньше с регулярками в С не работал
если не трудно помоги, пожалуйста, написать код для моего варианта
PM MAIL   Вверх
feodorv
Дата 7.8.2011, 10:09 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



А зачем такие сложности с регулярными выражениями?
Почему нельзя заставить работать scanf? Что-то вроде:

Код

char buf[1024];
float t;
BOOL hasTime = FALSE;

...

while( fgets( buf, sizeof(buf), pFile) != NULL )
{
  int d1, d2, d3;
  float f1, f2, f3, f4;

  if( sscanf( buf, "РАСШИРЕННАЯ ПЕЧАТЬ. Относит. время (час) = %e", &t) != EOF ) hasTime = TRUE;

  if( hasTime )
    if( sscanf( buf, "%d   %f   %f/  %d  %f  %f/  %d\n", &d1, &f1, &f2, &d2, &f3, &f4, &d3) != EOF )
      addLine( d1, f1, f2, d2, f3, f4, d3);
    else
       printf( "Invalid line: %s", buf);
}

if( ferror(pFile) ) ...

...


Честно говоря, не люблю scanf'ы и обычно разбираю строку ручками.

PS Очень неприятная у Вас конструкция с if( scanf && scanf )


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
gromo
Дата 10.8.2011, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пытаюсь реализовать вот так:
Код

char buf[1024];
FILE *pFile = fopen("file.txt","r");
float t;

int d2, d3, SloiNo;
float f1, f2, f3, f4;
if(pFile){
    while(true){
        if((ch = fgetc(pFile)) != EOF){                
            if( fscanf( pFile, "РАСШИРЕННАЯ ПЕЧАТЬ. Относит. время (час) = %e", &t) ) hasTime = TRUE;
                        if( hasTime )
                                if( fscanf( pFile, "%d   %f   %f/  %d  %f  %f/  %d\n", &d1, &f1, &f2, &d2, &f3, &f4, &d3) ){
//...
                                 }
                                else  printf( "Invalid line: %s", buf);
                }
        }
}

но ничего не получается. В чём проблема?

Это сообщение отредактировал(а) gromo - 10.8.2011, 00:44
PM MAIL   Вверх
borisbn
Дата 10.8.2011, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



gromo, 
1. Где выход из
Цитата(gromo @  10.8.2011,  00:43 Найти цитируемый пост)
 while(true){

?
2. 
Цитата(gromo @  10.8.2011,  00:43 Найти цитируемый пост)
if((ch = fgetc(pFile)) != EOF){     

зачем это ?
3. fscanf возвращает количество переменных, которое она заполнила, а не true/false. Т.е., если заполнена даже одна переменная (а не все), то твоя конструкция if ( fscanf(...) ) отработает... а не должна.
4. (и самое главное)
Цитата(gromo @  10.8.2011,  00:43 Найти цитируемый пост)
но ничего не получается

- не компилируется ?
- компилируется, запускается и вылетает ?
- запускается, не вылетает, но работает не так, как задумано ?

кста, если последний вариант, то для этого существует отладчик...

и ещё: тебе feodorv дал рабочий вариант, который нужно всего чуть-чуть допилить до твеоих нужд ( заменить ... на то, что там должно быть и реализовать ф-цию addLine ). Чего не юзаешь ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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