Файловые Потоки (помогите Найти Ошибку) C++

203

New Member
21.02.2012
2
0
#1
Здравствуйте. У меня возникла небольшая проблема с одной программой на тему Файловые потоки. Программа не компилируется какие то 8 ошибок и я не могу разобраться какие. помогите пожалуйста заранее спасибо.
Вот условие

Написать программу, которая выводит меню следующего вида:
Ввод
Корректировка
Удаление
Вывод
Поиск
Выход
Для каждой машины укажите ее марку, год выпуска, пробег, расход на 100 км, стоимость. Предусмотреть поиск по марке машины.

Вот что получилось
C++:
#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;
class avto
{
public:
char marka[12];
int data_vypuska[3];
char color[12];
int probeg[11];
int rashod[10];
};

// Ввод данных.
void input(char * filename)
{
int count;
cout << "Kol-vo: ";
cin >> count;
avto S;
fstream F; 
F.open(filename, ios::out | ios::binary);
for (int i=0; i<count; ++i)
{ 
cout << endl;
cout << "Vvedite marku avto: "; cin >> S.marka;
cout << "Vvedite datu vypuska(dd mm gg) avto: "; cin >> S.data_vypuska[0] >> S.data_vypuska[1] >> S.data_vypuska[2];
cout << "Vvedite probeg: "; cin >> S.probeg;
cout << "Vvedite rashod 100: "; cin >> S.rashod;
F.write((char *)&S, sizeof(S)); 
}
F.close();
}

// доп. чек: Проверка количества записей.
int GetCount(char * filename)
{
avto S;
fstream F;
F.open(filename, ios::in | ios::binary);
int count = 0;
while (F.read((char *)&S, sizeof(S)))
++count;

return count;
}

// вывод всех записей
void outputAll(char* filename)
{
if (!GetCount(filename))
{
cout << "Error: Ne naydeno zapicey." << endl;
return;
}
cout << "<>Output All Avto<>" << endl;
avto S;
fstream F;
F.open(filename, ios::in | ios::binary);
int number = 0;
cout << "MARKA | " << "DATA VYPUSKA | " << "probeg | " << "rashod" << endl;
while (F.read((char *)&S, sizeof(S)))
{
cout << number << ") " << S.marka << " | " << S.data_vypuska[0] << ":" << S.data_vypuska[1] << ":" << S.data_vypuska[2] << " | " << S.probeg << " | " << S.rashod << endl;
++number;
}
cout << endl;
}

// загрузка в оперативу
void LoadInMemory(avto *S, char* filename)
{
fstream F; 
F.open(filename, ios::in | ios::binary);
int number = 0;
while (F.read((char *)&S[number], sizeof(S[number])))
++number;
F.close();
}

// удаление по индексу
void DeleteIndexFromKey(int key, char* filename = NULL)
{ 
if (!GetCount(filename))
{
cout << "Error: Ne naydeno zapicey." << endl;
return;
}
avto* S = new avto[GetCount(filename)]; 
LoadInMemory(&S[0], filename);

fstream F;
F.open(filename, ios::out | ios::binary);
for (int i = 0; i <= GetCount(filename); ++i)
{
if (i != key) 
F.write((char *)&S[i], sizeof(S[i]));
}
cout << "Complete remove: " << S[key].marka << endl;
delete [] S;
F.close();
}

// удаление
void usDelete(char* filename)
{ 
if (!GetCount(filename))
{
cout << "Error: Ne naydeno zapicey." << endl;
return;
}
cout << "Udalit' zapis'" << endl;
outputAll(filename);
int key;
cout << "Input key for delete: ";
cin >> key;
if (key > GetCount(filename))
{
cout << "Error: key no correction." << endl;
return;
}
DeleteIndexFromKey(key, filename);
cout << endl;
}

// корректировка
void Correction(char * filename)
{
if (!GetCount(filename))
{
cout << "Error: Ne naydeno zapicey." << endl;
return;
}
avto* S = new avto[GetCount(filename)];
outputAll(filename);
int index, key;
cout << "Input key for correction: ";
cin >> index;
cout << "Chto pravim?(1 - marka;; 2 - data vypuska; 3 - probeg; 4 - rashod): ";
cin >> key;
LoadInMemory(&S[0], filename);
switch (key)
{
case 1:
cout << "Vvedite new marku: ";
cin >> S[index].marka;
break;
break;
case 2:
cout << "Vvedite new data vypuska: ";
cin >> S[index].data_vypuska[0] >> S[index].data_vypuska[1] >> S[index].data_vypuska[2];
break;
case 3:
cout << "Vvedite new probega: ";
cin >> S[index].probeg;
break;
case 4:
cout << "Vvedite new family vladelca: ";
cin >> S[index].rashod;
break;
default:
cout << "Error: key." << endl;
return;
}

fstream F;
F.open(filename, ios::out | ios::binary);
for (int i = 0; i <= GetCount(filename) + (index == 0) ? 1 : 0; ++i) 
F.write((char*)&S[i], sizeof(S[i]));

cout << "Complete correction." << endl;
cout << endl;
delete [] S; 
}
bool chars(char* char1, char* char2)
{
int count = 0;
int sovpad = 0;
while (char1[count] != '\0')
{
if (char1[count] == char2[count]) 
++sovpad; 
++count;
}

if (count == sovpad)
return true;

return false;
}

// поиск
void Search(char * filename)
{
if (!GetCount(filename))
{
cout << "Error: Ne naydeno zapicey." << endl;
return;
}
cout << endl;
cout << "<>Search<>" << endl;
avto* S = new avto[GetCount(filename)];
LoadInMemory(&S[0], filename);
char search_marka[20];
bool flag = false;
cout << "Vvedite family vladelca: ";
cin >> search_marka; 
for (int i = 0; i < GetCount(filename); ++i)
{
if (chars(S[i].marka, search_marka))
{
if (!flag)
cout << "MARKA | " << "DATA VYPUSKA | " << "Probeg | " << "FAMILY" << endl;
cout << i << ") " << S[i].marka << " " << S[i].data_vypuska[0] << ":" << S[i].data_vypuska[1] << ":" << S[i].data_vypuska[2] << " | " << S[i].probeg << " | " << S[i].rashod << endl;
flag = true;
}
}
if (!flag)
cout << "Not found." << endl;
cout << endl;
}

int main()
{
bool active = true;
int n = 0;
char filename[20]; 
cout << "filename = ";
cin >> filename; 
do
{
cout << "<>Vvod - 1" << endl;
cout << "<>Korrect - 2" << endl;
cout << "<>Udalenie - 3" << endl;
cout << "<>Vyvod - 4" << endl;
cout << "<>Poisk - 5" << endl;
cout << "<>Vyhod - 6" << endl;
cout << "Command -> ";
cin >> n;
switch (n)
{
case 1:
input(filename);
break; 
case 2:
Correction(filename);
break;
case 3:
usDelete(filename);
break;
case 4:
outputAll(filename);
break;
case 5:
Search(filename);
break;
case 6:
active = false;
break;
default:
cout << "Error: Input key." << endl; 
break;
}
} while (active);
system("pause");
return 0;
}
 

Whatka

Well-Known Member
09.10.2011
428
4
24
Минск
#2
во первых ,зачем подключаешь "stdafx.h",ты знаешь что это?что это даёт?
во вторых у тебя поля int probeg[11];int rashod[10];-это массивы!!а не числа из стольки цифр
поэтому cin >> S.probeg; неправильно надо или cin >> S.probeg;или убрать массив
 

203

New Member
21.02.2012
2
0
#3
Спасибо за ответ.
Что такое stdafx.h вроде дефолт библиотека на visual C++
 

203

New Member
21.02.2012
2
0
#4
Подскажите почему у меня выводит место расхода и пробега какую то ерунду наверно адрес ячейки ил что хз.
 

203

New Member
21.02.2012
2
0
#5
Починил всё, но теперь новая проблема. Я ввожу записи и если я хочу их откорректировать то потом творится какая то ерунда, если после корректировку нажать вывод то запись которую я корректировал она просто удаляется, а остальные выводятся как то криво. Помогите разорятся в проблеме.