Вообщем задача достаточно тривиальна, считываю таблицу из файла .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
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?