Двоичные файлы

  • Автор темы ermackprogramis
  • Дата начала
E

ermackprogramis

#1
Писал програму и в итоге не могу понять почему не считаваются данные с файла. Скажите почему так пожалуйста.
Вот фрагмент кода( 2 функции)
C++:
#include<iostream>
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<iomanip>

using namespace std;

//структура 'car'
struct Car 
{
char TradeMark[10]; //
bool Type;  //тип
char info[10]; //для грузовых грузоподъемность, легковых цвет
char numPlate[10]; //номерной знак
int WorkTerm; //термин работы
};

Car cardat[100]; //массив переменных класса Car 
int num; //количество записей в базе
FILE *Mcar;

//==ввод данных==
void WriteInfo() 
{
if(Mcar!=NULL) //если файл существует
remove("Mcar.dat"); // удалить
else //нет
{
Mcar=fopen("Mcar.dat","wb"); // ссоздать для записи
int num=0; // начальное значение счетчика записей
do
{
system("cls"); //очитстка экрана
cerr<<"===Adding information to the database==="<<endl; 
cerr<<"Enter trade-mark"<<endl;
cin>>cardat[num].TradeMark; //ввод марки
cerr<<"Enter type of the car (0-cargo 1-automobile)"<<endl;
getch()==49 ? cardat[num].Type=1 : cardat[num].Type=0; //ввод типа авто
if(!cardat[num].Type) //в зависимости от авто
cerr<<"Enter car's carrying capacity"<<endl; //вывести запрос на ввод грузоподъемності
else cerr<<"Enter car's color"<<endl; //или цвета
cin>>cardat[num].info; //ввод грузоподъемності или цвета
cerr<<"Enter car's number-plate"<<endl;
cin>>cardat[num].numPlate; //ввод номерного знака
cerr<<"Enter car's work term"<<endl;
cin>>cardat[num].WorkTerm; //строк службы
fwrite(&cardat[num],sizeof(Car),1,Mcar); // запись в бинарный файл
num++; //увеличение количества записей
if (num==100) break; //если количество записей 100 то выйти
cerr<<"Do you want to add more cars to the database?"<<endl;
}while(getch()!='n'); //запрос на продолжение добавление записей у базу
fclose(Mcar); // закрытие файла
}
}

//==вывод данных==
void PrintInfo() 
{
Mcar=fopen("Mcar","rb");
if((Mcar=fopen("Mcar","rb"))) // проверка файла
{
cerr<<"File Do Not Exist!!!"<<endl;
}
else
{
system("cls"); ///очитстка экрана
cerr<<"===Information in the database==="<<endl;
cerr<<"================================="<<endl;
//вывод оглавления
cerr<<setw(10)<<"Trade-mark"<<setw(12)<<"Type"<<setw(17)<<"Cargo capacity"<<setw(10)<<"Color"<<setw(15)<<"Number-plate"<<setw(12)<<"Work term"<<endl<<endl;
fread(&cardat,sizeof(Car),1,Mcar);
while(!feof(Mcar))
{
for (int i=0;i<num;i++) //для всех элементов базы
{
cerr.setf(ios::left);
cerr<<setw(10)<<cardat[i].TradeMark; //вывести марку
//вывести тип,для грузовых-грузоподъемность,для легковых-цвет
if (!cardat[i].Type) {cerr<<setw(12)<<"Cargo"<<setw(17)<<cardat[i].info<<setw(10)<<"No info";}
else {cerr<<setw(12)<<"Automobile"<<setw(17)<<"No info"<<setw(10)<<cardat[i].info;}
cerr<<setw(15)<<cardat[i].numPlate; //вывести номерной знак
cerr<<setw(12)<<cardat[i].WorkTerm<<endl; //вывести строк работы
}
fread(&cardat,sizeof(Car),1,Mcar);
}
fclose(Mcar);
}
cerr<<endl<<"Press any key to exit to the main menu"<<endl;
getch();
}

//==главная функция==
int main()
{
num=0; //присвоить количество записей 0
while (true) //бесконечный цикл цикл
{
system("cls"); //очищення экрана
cerr<<"				  MENU			  "<<endl;
cerr<<"1. Input information to the database"<<endl;
cerr<<"2. Output the information"<<endl;
cerr<<"3. Number-plates of cars with carrying capacity not lower than entered"<<endl;
cerr<<"4. Cars of entered type and color"<<endl;
cerr<<"5. Information about cars whith term of work higter than entered"<<endl;
cerr<<"6. Exit"<<endl;
switch ((int)getch()) //в зв зависимости от кода введенного символа...
{
case 49: {WriteInfo();break;} //если код 1 то вызвать функцию для записи у базу
case 50: {PrintInfo();break;} //если код 2 то вызвать функцию для вывода базы
case 51: {LowerCap(); break;} //если код 3 то вызвать функцию для грузоподъемности
case 52: {TypeColor();break;} //если код 4 то вызвать функцию для определения авто заданого цвета
case 53: {DeleteInfo();break;} //если код 5 то ввызвать функцию для удаления записей об авто с строком работы..
case 54: {exit(0);break;} //если код 6 то выйти из программы
default : {cerr<<"Sorry Wrong Choice!!!";getch();break;} //если введенный код не отвечает даным то вывести сообщение об ошибке
}
}
}
 
R

Rififi

#2
слишком много левого кода, который в данном случае только затрудняет анализ..
приведи минимальный само-достаточный пример, демонстрирующий проблему.
 
E

ermackprogramis

#3
Но в том и смысл что если его убрать то все пашет, а вот с ним нет
 
S

solova

#4
имя файла состоит не только из названия, но и из расширения (забыл .dat написать)
C++:
Mcar=fopen("Mcar.dat","rb");
и если я не ошибаюсь то проверку можно и так делать
C++:
if(fopen("Mcar.dat","rb"))
 

lazybiz

Well-known member
03.11.2010
1 339
0
#5
C++:
	if(Mcar!=NULL) //если файл существует
remove("Mcar.dat"); // удалить
else //нет
{
Mcar=fopen("Mcar.dat","wb"); // ссоздать для записи
можно (даже нужно) заменить на
C++:
Mcar=fopen("Mcar.dat","wb+");
Два раза открывать файл не надо, к тому же у тея тут ошибка в условии:
C++:
	Mcar=fopen("Mcar","rb");
if((Mcar=fopen("Mcar","rb"))) // проверка файла
замени на
C++:
if( !(Mcar=fopen("Mcar","rb")) ) ... // проверка файла
Заключи структуру Car в блок:
C++:
#pragma pack( push, 1 )
struct Car {
...
}
#pragma pack( pop )