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

Тема в разделе "Общие вопросы по С и С++", создана пользователем ermackprogramis, 11 фев 2011.

  1. ermackprogramis

    ermackprogramis Гость

    Писал програму и в итоге не могу понять почему не считаваются данные с файла. Скажите почему так пожалуйста.
    Вот фрагмент кода( 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;} //если введенный код не отвечает даным то вывести сообщение об ошибке
    }
    }
    }
     
  2. Rififi

    Rififi Гость

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

    ermackprogramis Гость

    Но в том и смысл что если его убрать то все пашет, а вот с ним нет
     
  4. solova

    solova Гость

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

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (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 )
     
Загрузка...
Похожие Темы - Двоичные файлы
  1. alekssgor
    Ответов:
    1
    Просмотров:
    1.858
  2. lmike
    Ответов:
    27
    Просмотров:
    251
  3. garrick
    Ответов:
    25
    Просмотров:
    658
  4. sgfsdg
    Ответов:
    1
    Просмотров:
    426
  5. vovanabali
    Ответов:
    0
    Просмотров:
    534

Поделиться этой страницей