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

Программа по обработке данных из файла. Подскажите! - C++

Восстановить пароль Регистрация
 
Gellert
0 / 0 / 0
Регистрация: 15.10.2010
Сообщений: 7
14.01.2014, 12:27     Программа по обработке данных из файла. Подскажите! #1
Задача: есть текстовый файл, в котором лежат данные типа float/double.
Приведу пару первых строк оттуда, чтобы было понятно:

T[s] GYRO_X GYRO_Y GYRO_Z
0.050691 1.204773 1.013245 0.081604
0.058691 0.431396 0.554199 0.130066

Еще несколько столбцов вправо и очень много строк вниз (по времени).
Необходимо забрать из этого файла данные, в каждом столбце находить среднее каждые 100 значений, полученную строки из усредненных значений переписать в другой файл.

Проблема: проблема в функции strToMass. На выходе получаются данные в нужном формате (запись только каждого 100 числа), но записывает не среднее, а последнее из 100 значений. Я не знаю, как корректно вытащить из массива char значения, обработать их, а потом запихнуть обратно в строку уже среднее и передать на запись. Посмотрите, помогите!


Собственно, написанный код под это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
char* strToMass(char *sLine, int n)
{
    int i;
    char *ptrEnd,*ptrEnd2;                     //указатели для функции strtod
    double mas[100][20], avrgMas[20];          //массив для 100 знач. и для их среднего
    mas[n][0]=strtod(sLine,&ptrEnd);         //в первую ячейку первое значение из строки
    avrgMas[0]=0;
        for(i=1; i<20; i++)
        { 
            mas[n][i]=strtod(ptrEnd,&ptrEnd2);     //в остальные ячейки все значения после первого числа из строки
            *ptrEnd=*ptrEnd2;
            avrgMas[i]+=mas[n][i];         //добавляем в каждую ячейку значение из соотв. столбца
        }
        if(n==100)
        {
            for(int k=0;k<20;k++)
            {
                avrgMas[k]=avrgMas[k]/100;     // на 100м значении
           _snprintf(sLine, 256, "%.10g ", avrgMas[k]);  //вот здесь вобще туплю. не знаю, как в строку добавить все значения из массива со средними
            }
            
        }
        return sLine;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    ifstream ifs;
    ofstream ofs;
    int n=0, flag=0;
    int i;
    char *ptrEnd,*ptrEnd2;  
    char sLine[256];
    double mas[20][100], avrgMas[20];
    mas[0][n]=strtod(sLine,&ptrEnd);
    avrgMas[0]=0;
 
    ifs.open("polet.txt",ios::in);           //открываем файл на чтение
    if(!ifs)
        std::cout<<"Open error to read";      // проверяем на ошибки
    else
        ofs.open("polet1.txt",ios::out);     //открываем файл на запись
    if(!ofs)
        std::cout<<"Open error to write";
    else
    {
        while(!ifs.eof())           //поток идет до конца файла
        {
            ifs.getline(sLine,256);  //берем строку из файла
            if(flag==0)              
            {
                ofs<<sLine<<endl;   //по флагу проходим первую строчку с текстом, записываем ее и не заходим сюда больше
                flag=1;
            }
            else
            {
                strToMass(sLine,n);   //передаем строку в функцию. Функция теоретически идет по указателю и должна менять исходное значение sLine
                n++;                  //счетчик до 100, он же количество строк в массиве
                if(n==100)            
                {
                    ofs<<sLine<<endl; //на 100 итерации строку из средних знач. записываем во второй файл.
                    n=0;              //обнуляем n, чтобы опять отсчитывать 100 значений
                }
            }
        }
        ifs.close();                  //закрываем потоки
        ofs.close();
    }
    std::cout<<"\r\nPress any key\r\n";
    _getch();
    return 0;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2014, 12:27     Программа по обработке данных из файла. Подскажите!
Посмотрите здесь:

ввод структурированных данных в файл и вывод данных из этого файла на экран (сделать хра-нилище данных в файле). C++
C++ подскажите что делать при вводимых данных 10 25 и 5 20 программа работает не правильно должна выводить 135 подскажите что делать
C++ подскажите не запускается программа
C++ Пользователь вводит имя файла, программа выводит содержимое файла с указанием номеров строк.
Написать программу по обработке файла, состоящего из структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 13:02     Программа по обработке данных из файла. Подскажите! #2
Зачем здесь, вообще, чтение строк, если:
Цитата Сообщение от Gellert Посмотреть сообщение
данные типа float/double.
? Можно просто числа читать.
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.01.2014, 13:11     Программа по обработке данных из файла. Подскажите! #3
Gellert, alsav22 прав.
Разве
C++
1
2
3
for (int n = 1; n < 100; i++)
for(i = 1; n < 20; j++)
ifs >> mas[n][i];
не выходит?
Gellert
0 / 0 / 0
Регистрация: 15.10.2010
Сообщений: 7
14.01.2014, 13:22  [ТС]     Программа по обработке данных из файла. Подскажите! #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Зачем здесь, вообще, чтение строк, если:

? Можно просто числа читать.
Предлагаете через fopen, fprintf и fscanf?

Добавлено через 4 минуты
Цитата Сообщение от Stella Посмотреть сообщение
Gellert, alsav22 прав.
Разве
C++
1
2
3
for (int n = 1; n < 100; i++)
for(i = 1; n < 20; j++)
ifs >> mas[n][i];
не выходит?
Честно говоря, не пробовал. Попробую. А поток на чтение разве может просто так понять, что у меня там не просто символы какие-то, а числа с плавающей точкой?
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.01.2014, 13:38     Программа по обработке данных из файла. Подскажите! #5
Цитата Сообщение от Gellert Посмотреть сообщение
А поток на чтение разве может просто так понять, что у меня там не просто символы какие-то, а числа с плавающей точкой?
Можно. Если файл текстовый, то так и делают.
Но первую строчку с заголовком таблицы считайте как строку.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 13:57     Программа по обработке данных из файла. Подскажите! #6
Цитата Сообщение от Gellert Посмотреть сообщение
А поток на чтение разве может просто так понять, что у меня там не просто символы какие-то, а числа с плавающей точкой?
Смотря какой метод чтения поток использует. Есть методы форматируемого чтения (>>), которые понимают, как нужно обработать символьные данные (определяют по типу переменной, куда идёт чтение).
Gellert
0 / 0 / 0
Регистрация: 15.10.2010
Сообщений: 7
14.01.2014, 14:22  [ТС]     Программа по обработке данных из файла. Подскажите! #7
Сделал вот так, выдает какую-то жесть. Половина файла забита по столбикам одинаковым значением -9.25596e+05. Во второй половине значения разные, но вид такой же.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if(flag==0)              
            {
                ifs.getline(sLine,256);
                ofs<<sLine<<endl;   //по флагу проходим первую строчку с текстом, записываем ее и не заходим сюда больше
                flag=1;
            }
            else
            {
                
                for(i = 1; i < 20; i++)
                {
                    ifs >> mas[n][i];
                    avrgMas[i]+=mas[n][i];
                }
                n++;                  //счетчик до 100, он же количество строк в массиве
                if(n==100)            
                {
                    for(int k=0;k<20;k++)
                    {
                      avrgMas[k]=avrgMas[k]/100;
                      ofs << setw(15) << avrgMas[k];
                    }
                    ofs<<endl;      //переход на новую строку
                    n=0;              //обнуляем n, чтобы опять отсчитывать 100 значений
                }
            }
Программа же должна идти по строкам файла? Т.е. в
C++
1
ifs >> mas[n][i];
берется определенная конкретная строка, и значения из нее попадают в массив, далее по циклу while(!ifs.eof()) берется следующая строка?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 14:27     Программа по обработке данных из файла. Подскажите! #8
Сколько в строке чисел?
Gellert
0 / 0 / 0
Регистрация: 15.10.2010
Сообщений: 7
14.01.2014, 14:31  [ТС]     Программа по обработке данных из файла. Подскажите! #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Сколько в строке чисел?
18 чисел.

Пример полной строки:
0.050691 1.204773 1.013245 0.081604 0 0.0108185 -0.0326786 1.0341778 0 0.00948381 -0.02151299 0.99781299 0 187 516 1277590216 1277590216 147

Т.е. есть и целые и дробные числа
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 14:36     Программа по обработке данных из файла. Подскажите! #10
Цитата Сообщение от Gellert Посмотреть сообщение
18 чисел.
Почему тогда массив на 20?
C++
1
double mas[20][100]
Gellert
0 / 0 / 0
Регистрация: 15.10.2010
Сообщений: 7
14.01.2014, 14:48  [ТС]     Программа по обработке данных из файла. Подскажите! #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему тогда массив на 20?
Поменял на 18, результат, как и ожидалось, тот же.
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
14.01.2014, 15:07     Программа по обработке данных из файла. Подскажите! #12
Цитата Сообщение от Gellert Посмотреть сообщение
Т.е. в
Код C++
1
ifs >> mas[n][i];
берется определенная конкретная строка, и значения из нее попадают в массив,
не целая строка, а 1 число.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
    
 
int _tmain(int argc, _TCHAR* argv[])
{
    double mas [3][2];
    char tmp;
    ifstream ifs; 
    ifs.open("f:\\polet.txt",ios::in); 
    for (int n = 0; n < 3; n++)
        for(int i = 0; i < 2; i++)
            ifs >> mas[n][i];
    
    for (int n = 0; n < 3; n++)
    {
        for(int i = 0; i < 2; i++)
            cout <<  mas[n][i] << " ";
        cout << endl;
    }
    return 0;
}
Программа по обработке данных из файла. Подскажите!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 18:40     Программа по обработке данных из файла. Подскажите!
Еще ссылки по теме:

Создание класса по обработке данных массива C++
C++ Есть программа с Базой данных добавить функциюю удаления из файла
Программа по обработке осадков за неделю C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 18:40     Программа по обработке данных из файла. Подскажите! #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// после каждого числа в строке пробел
// после каждой строки в файле '\n'
// если строк, для очередной обработки, окажется меньше N,
// то будет обработано реальное количество строк
 
#include <Windows.h>
#include <iostream>
#include <fstream>
using namespace std;
 
int main() 
{ 
    const int N = 100; // количество строк для обработки
    const int M = 18; // количество чисел в строке
    
    ifstream ifs("polet.txt");           
    if(!ifs)
        cout << "Open error to read";  
    else
    {
        ofstream ofs("polet1.txt");  
        if(!ofs)
            cout<<"Open error to write";
        else
        {
            
            double mas[N][M];
            while(ifs)          
            {
                int i;
                for (i = 0; i < N; ++i)
                {                    
                    for (int j = 0; j < M && ifs; ++j)
                        ifs >> mas[i][j];
                    if (!ifs)
                        break;
                }   
                if (i == 0) break;
                for (int j = 0; j < M; ++j)
                {
                    double sum = 0;
                    int k;
                    for (k = 0; k < i; ++k)
                        sum += mas[k][j];
                    ofs << sum / k << ' ';
                }
                ofs << endl;
            }
            ofs.close();
        }
        ifs.close();
    }
    
    cout<<"Press any key\n";
    cin.get();
    return 0;
}
Yandex
Объявления
14.01.2014, 18:40     Программа по обработке данных из файла. Подскажите!
Ответ Создать тему
Опции темы

Текущее время: 23:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru