Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
vladko
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 44
#1

Обработка текстового файла - C++

31.03.2009, 11:44. Просмотров 1779. Ответов 11
Метки нет (Все метки)

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

1.3446 11
1.325 876
1.3567 32
...


Код
#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 поля)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2009, 11:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка текстового файла (C++):

Обработка текстового файла - C++
Доброго времени суток. Вопрос: как происходит обработка данного текстового файла при данном коде. Если возможно, с коментария у каждой...

Обработка информации из текстового файла - C++
Дан файл формата Р1, Р2, …, Р10 – объемы поставок; x1, x2, …, x20 – объемы потреблений; S1, S2, …, S10 – список поставщиков; ...

Посимвольная обработка текстового файла: распределение всех слов по длине - C++
Вывести в файле распределение всех слов по длине (т.е. сколько в файле слов из одной буквы, из двух и т.д.). За слово считать цепочку...

Добавить в конец первого текстового файла содержимое второго текстового файла - C++
Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Чтение текстового документа, обработка, запись нового - C++
Задача: есть текстовый документ типа: 36745 375294567456 80293455906 ... Нужно прочитать отбросить домашние телефоны,...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

11
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.03.2009, 11:59 #2
Код
        double a;
        int b;
        
        if(fscanf(f, "%lf %d", &a, &b) < 2)
            break;
Код
        char date[9], somth[7];     
        double a;
        int b;
        
        if(fscanf(f, "%8s%6s%lf %d", date, somth, &a, &b) < 4)
            break;
добавляет считывание полей, неясно нужны предыдущие поля или нет
0
vladko
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 44
31.03.2009, 12:30  [ТС] #3
Я так понял, что этот кусок позволяет просто обрабатывать новый файл... Спасибо. А как насчет обработки куска файла ограниченного датой и времени?
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.03.2009, 13:24 #4
она подготавливает новый формат для обработки (разделяет на отдельные фрагменты)
0
vladko
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 44
31.03.2009, 13:30  [ТС] #5
Это я понял.
Теперь как изменить строчку
Код
void __stdcall proc1(const char* fileName)
чтобы передать функции аргументы с которыми будут сравниваться date и somth? И как вообще их правильно сравнить?
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.03.2009, 13:46 #6
так как это строки, то применяется strcmp(date, patt);

можно создать структуру, записать в неё образцы и для date и для somth, потом передать указатель на неё в функцию и сверять date с образцом для date, somth с образцом для somth

Код
    if (strcmp(date, s->date_patt) == 0)
        printf("%s: equal\n", date);
0
vladko
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 44
31.03.2009, 14:50  [ТС] #7
Попробовал без структур
Код
int __stdcall proc1(const char* fileName, const char* datebeg, const char* timebeg,const char* dateend, const char* timeend)
...
if ( strcmp(date, datebeg) >= 0 && strcmp(time, timebeg) >= 0 && strcmp(date, dateend) <= 0 && strcmp(time, timeend) <= 0 )
условие никогда не выполняется. В чем ошибка?
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.03.2009, 16:16 #8
например date datebeg dateend какие ?
0
vladko
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 44
31.03.2009, 16:48  [ТС] #9
когда date=datebeg=dateend
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.03.2009, 17:06 #10
какие строки там ?

Код
date=datebeg=dateend
Код
    if (strcmp(date, datebeg) == 0 && strcmp(datebeg, dateend) == 0)
        ;
0
vladko
0 / 0 / 0
Регистрация: 31.03.2009
Сообщений: 44
31.03.2009, 17:50  [ТС] #11
Не понял...
Допустим файл такой:
20090325 000011;7610;1
20090325 000137;7610;1
20090325 000137;7609;1
20090325 000139;7610;1
20090325 000140;7610;1
20090325 000140;7610;1
20090325 000142;7610;6
20090325 000142;7611;1
20090325 000202;7615;1
20090325 000439;7611;1
20090325 000447;7614;1
20090325 000516;7611;1
20090325 000522;7613;1
20090325 000522;7613;4
Нужно взять кусок времени от 000100 до 000500
В функцию передаю такие аргументы:
datebeg="20090325" dateend="20090325"
timebeg="000100" timeend="000500"
date получается всегда равно "20090325"
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
31.03.2009, 18:23 #12
выводит строки диапазона
0
Вложения
Тип файла: zip str_diap.zip (504 байт, 18 просмотров)
31.03.2009, 18:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2009, 18:23
Привет! Вот еще темы с ответами:

Сортировка слов текстового файла путём слияния данных из файла и заданного внутреннего массива - C++
Здравствуйте. Имеется задание, которое я ни в коем случае не прошу за меня сделать. Мне непонятно пару моментов, которые бы мне...

Указание текстового файла-источника и принимающего файла в cmd - C++
Подскажите, как сделать что б при вводе через cmd надо было указывать файл-исходник и принимающий файл? &quot;полный путь\fdsfsd.exe in.txt...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла? - C++
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них запизаем, например в первый запихаем 1234 а во второй 5678 и...

Чтение текста из текстового фала, обработка слов и вывод в консоль - C++
Задача программы: считать текст из текстового файла; выделить слова с повторяющимися буквами другим цветом; вывести весь текст в консоль. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru