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

Найти значения в таблице из файлов - C++

Восстановить пароль Регистрация
 
FRINGE
3 / 3 / 0
Регистрация: 18.12.2012
Сообщений: 49
16.07.2015, 12:33     Найти значения в таблице из файлов #1
Вообщем задача достаточно тривиальна, считываю таблицу из файла .csv. Значения записываю в динамический двумерный массив типа string. Ввожу два параметра, и программа должна найти значения в таблице на пересечении.
При попытке запустить пишет что переменная linedfs использована прежде чем инициализирована.
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <stdafx.h>
#include <fstream>
#include <string>
using namespace std;
int CountStrings(istream &is)
{
    if (!is.good())
        return 0;
    string s;
    int nStrings=0;
    while (getline(is,s))
        ++nStrings;
    return nStrings;
}
int CountStrings(const char *name)
{
    fstream is;
    is.open(name);
    return is.good() ? CountStrings(is) : 0;
}
int CountLenght(istream &is)
{
    if (!is.good())
        return 0;
    string s;
    int nLenght=0;
    while (!(is.eof()))
        if (getline(is,s,';'))
        ++nLenght;
    return nLenght;
}
int CountLenght(const char *name)
{
    fstream is;
    is.open(name);
    return is.good() ? CountLenght(is) : 0;
}
int main()
{
    setlocale(LC_ALL,"Russian");
    fstream dfs("MSV-BD1.csv");//Открытие одного потока данных
    fstream hw("Kombi-31.csv");//открытие другого потока данных
    int stringsdfs=CountStrings("MSV-BD1.csv");//подсчет строк первого потока данных
    int stringshw=CountStrings("Kombi-31.csv");//подсчет строк второго потока данных
    //Символы в одной строке считаю как частное количества всех символов в файле на количество строк
    int lenghtdfs=CountLenght("MSV-BD1.csv")/stringsdfs+1;//подсчет символов в одной строке первого потока
    int lenghthw=CountLenght("Kombi-31.csv")/stringshw+1;//подсчет символов в одной строке второго потока
    cout <<stringsdfs<<" "<<lenghtdfs;
    cout <<stringshw<<" "<<lenghthw;
    string **basedfs=new string* [stringsdfs];
    for (int i=0;i<stringsdfs;i++){
        basedfs[i]=new string [lenghtdfs];}//создание динамического массива 
    string **basehw=new string* [stringshw];
    for (int i=0;i<stringshw;i++){
        basehw[i]=new string [lenghthw];}//создание динамического массива 
    //заполнение массива данными из файла, разделенными ';'
    for (int i=0; i<stringsdfs;i++)
    {
        for (int j=0;j<lenghtdfs;j++){
            if (j<lenghtdfs-1)//';' не ставится в конце строки. поэтому последний символ читаю так
            getline(dfs,basedfs[i][j],';');
            else
            dfs>>basedfs[i][j];}
    }//заполнение массивов данными,разделенных ';'
    for (int i=0; i<stringshw;i++)
    {
        for (int j=0;j<lenghthw;j++){
            if (j<lenghthw-1)//';' не ставится в конце строки. поэтому последний символ читаю так
            getline(hw,basehw[i][j],';');
            else
            hw>>basehw[i][j];}
    }//заполнение массивов данными БД
    cout <<"Введите значение Ду: ";
    string Du_dfs; //параметр, по которому определяю номер столбца таблицы
    do{
    cin>>Du_dfs;
    if (!(Du_dfs=="15LF" || Du_dfs=="15 LF" || Du_dfs=="15 Lf" || Du_dfs=="15lf" || Du_dfs=="15 lf" || Du_dfs=="15" || Du_dfs=="20" || Du_dfs=="25" || Du_dfs=="32" || Du_dfs=="40" || Du_dfs=="50"))
        cout <<"Такого значения не существует - проверьте правильность введенных данных \n";
    }while (!(Du_dfs=="15LF" || Du_dfs=="15 LF" || Du_dfs=="15 Lf" || Du_dfs=="15lf" || Du_dfs=="15 lf" || Du_dfs=="15" || Du_dfs=="20" || Du_dfs=="25" || Du_dfs=="32" || Du_dfs=="40" || Du_dfs=="50"));
    int rowdfs;//сам столбец 
    if (Du_dfs=="15LF" || Du_dfs=="15 LF" || Du_dfs=="15 Lf" || Du_dfs=="15lf" || Du_dfs=="15 lf")
        rowdfs=1;
    if (Du_dfs=="15")
        rowdfs=4;
    if (Du_dfs=="20")
        rowdfs=7;
    if (Du_dfs=="25")
        rowdfs=10;
    if (Du_dfs=="32")
        rowdfs=12;
    if (Du_dfs=="40")
        rowdfs=15;
    if (Du_dfs=="50")
        rowdfs=16;
    string N;
    cout <<"Введите значение N: ";
    cin>>N;
    int linedfs;
    for (int i=1;i<stringsdfs;i++)//по первому столбцу ищу это значение, если нашел хочу запомнить строку.
    {
        cout<<basedfs[i][0]<<'\n';
    }
    cout<<basedfs[linedfs][rowdfs]<<'\n';
    system("pause");
}
Проверял правильность определения количества строк и столбцов, все верно, определяет правильно.
Проверял правильность заполнения массива, проверял крайние элементы - все выдает правильно, как и в файле.
Такое ощущение что условие
C++
1
if (basedfs[i][0]==N)
он просто отказывается читать. Я даже проверял писал например
C++
1
2
3
for (int i=0 . . .)
if (basedfs[i][0]=="3,00")
...
он аналогично не выполняет это условие. Хотя я точно знаю что значение 3,00 там есть.
Помогите пожалуйста в чем может быть дело. Уже голову все сломал.

Добавлено через 1 час 4 минуты
Считаю, что проблема в этих ';'. Потому что заменяя в файлах .csv точки с запятыми на пробелы и считывая из файла следующим образом
C++
1
2
3
4
for (int i=0; i<countdfs;i++){
        for (int j=0;j<18;j++)
            dfs>>basedfs[i][j];
            }//заполнение массивов данными БД
программа работает корректно.
Что может быть не так с getline?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2015, 12:33     Найти значения в таблице из файлов
Посмотрите здесь:

C++ Считать значения файла, найти их минимальное и максимальное значения
Написать программу, которая обеспечивает:начальное формирование каталога файлов;вывод каталога файлов;удаление файлов... C++
Найти сумму максимального значения элементов с четными индексами и минимального значения элементов с нечетными индексами в одномерном массиве C++
В таблице из N строк и N столбцов клетки заполнены цифрами от 0 до 9. Требуется найти такой путь из клетки (1, 1) в клетку (N, N C++
C++ В матрице А (mxn) найти найти сумму элементов по колонкам, значения которых по модулю меньше заданного числа К
Вычислить значения функции F на интервале от начального значения до конечного значения C++
Вычислить значения Х по формуле, найти значения функций от Х C++
C++ Найти элементы массива значения которых больше значения их индексов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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