С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Vector subscript out of range http://www.cyberforum.ru/cpp-beginners/thread1499651.html
Доброе утро, прочитал статью про векторы и решил создать один из них, однако при выводе он выдаёт ошибку: "Vector subscript out of range" , я не понимаю, где выход за пределы? Код: int N, pmas;...
C++ Создание векторного изображения День добрый. Стоит задача создание изображений из текстового файла. То есть есть файл формата текст 1а текст2а текст 1б текст2б нужно получить файлы текс1а.(расширение графического... http://www.cyberforum.ru/cpp-beginners/thread1499650.html
C++ Ввод данных в консоли
При вводе в консоль названия элемента, должна выводиться его плотность. Когда ввожу имена элементов первой структуры ( Fluids) и при нажатии enter, программа выводит его плотность. Беда в том, что во...
C++ Два конвейера разливают и закупоривают бутылки. Определить оптимальную расстановку бутылок.
Помогите с задачей.В цеху по производству напитков работают два конвеера.На первом конвеере напиток разливается в бутылки, а во втором происходит закупорка бутылок. После схождения с конвеера...
C++ Как правильно записать условие? http://www.cyberforum.ru/cpp-beginners/thread1499617.html
как вывести правильно чтобы правильно показывало Например если: у пользователя 600 очков показывает букву D- или же 1400очков помогите как правильно записать
C++ Error C2059: синтаксическая ошибка: [ Не понимаю, почему выдает такую ошибку... Подскажите, что не так, если не сложно, заранее спасибо! void vipusk_krakena(int* Massiv, int dlina) { int n=0; while(n<50) { for (int j=0; j<4;... подробнее

Показать сообщение отдельно
FRINGE
3 / 3 / 0
Регистрация: 18.12.2012
Сообщений: 49

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

16.07.2015, 12:33. Просмотров 245. Ответов 0
Метки (Все метки)

Вообщем задача достаточно тривиальна, считываю таблицу из файла .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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.