Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Обработка текстового файла


Автор: vladko 2.4.2009, 20:22
Есть функция в dll, которая обрабатывает текстовый файл и записывает результат в другой. Формат файла:

1.3446 11
1.325 876
1.3567 32
1.325 112

    
Код

#include <stdio.h>
#include <map>
using namespace std;
typedef map<double, int> Map;
extern "C"
{
void __stdcall proc1(const char* fileName)
{
    FILE* f = fopen(fileName, "r");
    if(!f)
    {
        printf("file not found\n");
        return;
    }
    Map m;
    for(;;)
    {
        double a;
        int b;
        if(fscanf(f, "%lf %d", &a, &b) < 2)
            break;
        pair<Map::iterator, bool> result = m.insert(pair<double, int>(a, b));
        if(!result.second)
            (result.first)->second += b;
    }
    fclose(f);
    char outFileName[264];
    strcpy(outFileName, fileName);
    strcat(outFileName, ".out");
    f = fopen(outFileName, "w");
    for(Map::iterator it = m.begin(); it != m.end(); ++it)
        fprintf(f, "%f %d\n", it->first, it->second);
    fclose(f);
}
}



Формат текстового файла изменился:

20090320 010013;1.3666;1
20090320 010017;1.3667;1
20090320 010017;1.3668;2
20090320 010021;1.3666;1
20090320 010027;1.3667;1
20090320 010057;1.3667;1
Как изменить функцию и добавить вычисления не по всему файлу а по куску ограниченному датой и временем (1 и 2 поля)? 

Автор: zim22 2.4.2009, 20:41
ваша тема есть в центре помощи
http://forum.vingrad.ru/topic-253578.html
не нужно их дублировать.

Автор: vladko 2.4.2009, 20:57
Хорошо, а так: помогите решить за вознаграждение...

Автор: shara 2.4.2009, 21:03
если есть исходники библиотеки то просто взять и переписать РУЦЯМИ код функции
и по моему там не функция а клас

в чем проблема то?  smile 

Автор: vladko 2.4.2009, 21:09
так здесь и есть весь исходник... просто я си почти не знаю... пишу прогу на VB...

Автор: shara 2.4.2009, 21:16
если у тебя нет исходников этой библиотечной функции то у тебя два варианта:
1) писать функцию заново самому
2) декомпилировать библиотеку 

я склоняюсь к первому варианту, так как второй очень трудоемкий

Автор: zim22 2.4.2009, 21:23
Цитата(vladko @  2.4.2009,  20:57 Найти цитируемый пост)
Хорошо, а так: помогите решить за вознаграждение...

smile держите
Код
#include <stdio.h>
#include <map>
using namespace std;
typedef map<int, int> Map;
extern "C"
{
void __stdcall proc1(const char* fileName)
{
    FILE* f = fopen(fileName, "r");
    if(!f)
    {
        printf("file not found\n");
        return;
    }
    Map m;
    for(;;)
    {
        int a;
        int b;
        double dummy1;
        int dummy2;
        if(fscanf(f, "%d %d;%lf;%d", &a, &b, &dummy1, &dummy2) < 4)
            break;
        pair<Map::iterator, bool> result = m.insert(pair<int, int>(a, b));
        if(!result.second)
            (result.first)->second += b;
    }
    fclose(f);
    char outFileName[264];
    strcpy(outFileName, fileName);
    strcat(outFileName, ".out");
    f = fopen(outFileName, "w");
    for(Map::iterator it = m.begin(); it != m.end(); ++it)
        fprintf(f, "%d %d\n", it->first, it->second);
    fclose(f);
}
}



Автор: vladko 2.4.2009, 21:23
ты не понял, у меня есть готовая dll  и ее исходник (он весь в первом посте)... исходник нужно изменить под новые условия, а ее откомпилю...

Автор: zim22 2.4.2009, 21:27
vladko, ...
присматрися вниматильний к маиму кодду

Автор: vladko 2.4.2009, 21:36
присмотрелся... а почему думми2 инт, там же может быть 235959? и как сделать ограничение по 1 и 2 полям?

Автор: zim22 2.4.2009, 21:39
vladko, рекомендую вам пересобрать dll. если она будет работать неправильно - потом и поспрашиваете.

Автор: Anikmar 2.4.2009, 21:51
vladko, И вознаграждение для zim22 не забудьте!  smile 

Автор: zim22 3.4.2009, 07:46
Цитата(Anikmar @  2.4.2009,  21:51 Найти цитируемый пост)
 И вознаграждение для zim22 не забудьте! 

vladko, я надеюсь вы слов на ветер не бросаете.  smile 

Автор: vladko 3.4.2009, 09:21
А вот это не выполнено - "добавить вычисления не по всему файлу а по куску ограниченному датой и временем"....

Автор: Anikmar 3.4.2009, 09:35
Цитата(vladko @  3.4.2009,  09:21 Найти цитируемый пост)
А вот это не выполнено - "добавить вычисления не по всему файлу а по куску ограниченному датой и временем".... 

Ну настоящий полковник. Тьфу - заказчик  smile 

Если у вас DLL принимает только один параметр - имя файла, уточните каким образом организовать интерфейс.

Автор: vladko 3.4.2009, 09:51
Ну, конечно, же добавить в список аргументов: dateBegin, timeBegin, dateEnd, timeEnd... Я думал, что это и так понятно...

Автор: Anikmar 3.4.2009, 10:02
Цитата(vladko @  3.4.2009,  09:51 Найти цитируемый пост)
Ну, конечно, же добавить в список аргументов: dateBegin, timeBegin, dateEnd, timeEnd... Я думал, что это и так понятно... 


Не факт. Можно передавать разными способами.
Короче: тип аргументов какой будете передавать?

Добавлено через 34 секунды
Файл, я так понимаю, отсортирован?

Автор: vladko 3.4.2009, 10:20
Да все  равно. Мне проще 4 строки передать. Файл сортирован по дате и времени...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)