Как быть
Задача надо заполнить массив
#include <iostream.h>
#include <fstream.h>
#include <string.h>
struct MyChar{
char rus[25];
char eng[25];
};
char temp[60];
int n = 0;
char next;
int t = 0;
int main(int argc, char* argv[])
{
ifstream input_num("Data.dat");
while(input_num.getline(temp,1500)) //Считаем количество строк
{n++;
}
input_num.close();
ifstream input("Data.dat");
typedef MyChar* array_my; //создаём массив структуры
array_my array;
array = new MyChar[n];
if(array == NULL)
{
cout<<"Error: Not free memmore";
}
//--------------------------------------------------------------------------------------------------------------------
/ / должен читаться поток input т.е. файл первое слово до пробела пишется в eng, после
//пробела в rus т.е. в строчке только два слова разделённые пробелом после символа конца строки /0 заполняется следующая ячейка массива
for(int x = 0; x < n; x++)
{char w =' ';
int z = 0;
do{
input.get(next);
if(next != ' ')
{
array[x].eng[z] = next;
}
z++;
}while(next == ' ');
/* z = 0;
do{
input.get(next);
if(next != '\n')
{
array[x].rus[z] = next;
}
z++;
}while(next == '\n');
*/
}
//-------------------------------------------------------чисто для проверки
cout<<n<<endl;
cout<<array[0].eng[0]<<endl;
cout<<array[0].eng[1]<<endl;
cout<<array[0].eng[2]<<endl;
cout<<array[0].eng[3]<<endl;
cout<<array[0].eng[4]<<endl;
cout<<array[0].eng[5]<<endl;
cout<<array[0].rus[0]<<endl;
cout<<array[0].rus[1]<<endl;
cout<<array[0].rus[2]<<endl;
cout<<array[0].rus[3]<<endl;
cout<<array[0].rus[4]<<endl;
cout<<array[0].rus[5]<<endl;
cout<<array[1].eng[0]<<endl;
cout<<array[1].eng[5]<<endl;
cout<<"Hellow"<<endl;
//-------------------------------------------------------------
input.close();
delete [] array;
return 0;
}
по тексту все подписано
Задача надо заполнить массив
}
А в чем проблема?
А в чем проблема?
этот участок не работает
for(int x = 0; x < n; x++)
{char w =' ';
int z = 0;
do{
input.get(next);
if(next != ' ')
{
array[x].eng[z] = next;
}
z++;
}while(next == ' ');
/* z = 0;
do{
input.get(next);
if(next != '\n')
{
array[x].rus[z] = next;
}
z++;
}while(next == '\n');
*/
}
struct MyChar{
char rus[25];
char eng[25];
};
Зачем при использовании STL использовать C-strings?
ifstream input_num("Data.dat");
while(input_num.getline(temp,1500)) //Считаем количество строк
{n++;
}
typedef MyChar* array_my; //создаём массив структуры
array_my array;
array = new MyChar[n];
Зачем? Ведь существуют стандартные контейнеры?
/ / должен читаться поток input т.е. файл первое слово до пробела пишется в eng, после
//пробела в rus т.е. в строчке только два слова разделённые пробелом после символа конца строки /0 заполняется следующая ячейка массива
for(int x = 0; x < n; x++)
{char w =' ';
int z = 0;
do{
input.get(next);
if(next != ' ')
{
array[x].eng[z] = next;
}
z++;
}while(next == ' ');
/* z = 0;
do{
input.get(next);
if(next != '\n')
{
array[x].rus[z] = next;
}
z++;
}while(next == '\n');
*/
}
Зачем так сложно? Ведь у тебя есть потоки!
//-------------------------------------------------------чисто для проверки
cout<<n<<endl;
cout<<array[0].eng[0]<<endl;
cout<<array[0].eng[1]<<endl;
cout<<array[0].eng[2]<<endl;
cout<<array[0].eng[3]<<endl;
cout<<array[0].eng[4]<<endl;
cout<<array[0].eng[5]<<endl;
cout<<array[0].rus[0]<<endl;
cout<<array[0].rus[1]<<endl;
cout<<array[0].rus[2]<<endl;
cout<<array[0].rus[3]<<endl;
cout<<array[0].rus[4]<<endl;
cout<<array[0].rus[5]<<endl;
cout<<array[1].eng[0]<<endl;
cout<<array[1].eng[5]<<endl;
cout<<"Hellow"<<endl;
Вот ты уже в плотную подошел к unitesting-у, только зачем для тестовой системы использовать такое ненадежное звено, как человек? Поручи тестирование машине!
А теперь такой вариант решения твоей задачи:
#include <list>
#include <fstream>
using namespace std;
struct MyChar {
string rus;
string eng;
};
typedef list<MyChar> MyChars;
int main()
{
MyChars myChars;
ifstream input("Data.dat");
if(!input.is_open()) return -1;
while( !input.eof() ) {
MyChar tmp;
input >> tmp.eng >> tmp.rus;
if( !tmp.eng.empty() && !tmp.rus.empty() ) {
myChars.push_back(tmp);
}
}
return 0;
}
#include <list>
#include <fstream>
using namespace std;
struct MyChar {
string rus;
string eng;
};
typedef list<MyChar> MyChars;
int main()
{
MyChars myChars;
ifstream input("Data.dat");
if(!input.is_open()) return -1;
while( !input.eof() ) {
MyChar tmp;
input >> tmp.eng >> tmp.rus;
if( !tmp.eng.empty() && !tmp.rus.empty() ) {
myChars.push_back(tmp);
}
}
return 0;
}
можно дописать сюда как проверить что считалось
(наверно книги по которым я учусь совсем старые может ссылка есть где качнуть не просто книгу а САМОУЧИТЕЛЬ с вопросами и задачами и ответами на них)
можно дописать сюда как проверить что считалось
Тебя интересует модульное тестирование или просто как достать данные из полученных структур?
Второе проще, поэтому покажу прямо сейчас. Пример, как пройтись по контейнеру итератором:
cout << it->eng << " : " << it->rus << endl;
}
Если нужен индексный доступ, то используем контейнер std::vector, а не std::list:
#include <vector>
#include <fstream>
using namespace std;
struct MyChar {
string rus;
string eng;
};
typedef vector<MyChar> MyChars;
int main()
{
MyChars myChars;
ifstream input("Data.dat");
if(!input.is_open()) return -1;
while( !input.eof() ) {
MyChar tmp;
input >> tmp.eng >> tmp.rus;
if( !tmp.eng.empty() && !tmp.rus.empty() ) {
myChars.push_back(tmp);
}
}
for(int i=0; i<myChars.size(); ++i) {
cout << myChars.eng << " : " << myChars.rus << endl;
}
return 0;
}