2014-02-10 2 views
1

Во-первых, я инициализирую файл «hardware.dat», записав следующие данные и затем отобразив их в виде списка. enter image description here enter image description hereПотеря данных при записи и чтении данных из файла (файл произвольного доступа, C++)

Однако, когда я обрабатываю выбор 2, а затем выйти выбор 2 без редактирования или добавления чего-либо, все данные потерять. Я предлагаю, чтобы ничего не изменилось. enter image description here

Почему проблема существует? Как это исправить?

Благодарим за внимание.


Код:

int question_3() 
{ 
    cout << "Question 3" << endl; 
    create_One_Hundred_blank_Data(); 
    char choice = '0'; 
    do 
    { 
    cout << "---------------Main Menu---------------" << endl 
     << "1. Initialize hardware data." << endl 
     << "2. Add/Edit data." << endl 
     << "3. Remove data." << endl 
     << "4. Show whole data in the file." << endl; 
    cout << "Enter choice > ";  choice = getch();  cout << choice << endl;  // #include <conio.h> 
    switch_Choice(choice); 
    }while (choice != '0'); 

    cout << "Program is ended." << endl; 
    return 0; 
} 


void switch_Choice(char choice) 
{ 
    switch (choice) 
    { 
     case '1': 
      choice_1(); 
      break; 

     case '2': 
      choice_2(); 
      break; 

     case '3': 
      choice_3(); 
      break; 

     case '4': 
      choice_4(); 
      break; 
    } 
} 



void choice_2() 
{ 
    hardware.open("hardware.dat", ios::binary | ios::out); 
    if (!hardware) 
    { 
     cerr << "File could not be opened." << endl; 
     exit(1); 
    } 

    int record = 0; 
    string tool_name = ""; 
    int quantity = 0; 
    int cost = 0; 
    string buffer_Eater = ""; 

     cout << "Enter record number <O to exit input> : ";  cin >> record; 
    while(record != 0) 
    { 
     cout << "Enter tool name      : ";  getline(cin, tool_name); getline(cin, buffer_Eater); 
     cout << "Enter quantity      : ";  cin >> quantity; 
     cout << "Enter cost       : ";  cin >> cost; 

     write_Single_Data(myHardwareData, record, tool_name, quantity, cost); 

     cout << "Enter record number <O to exit input> : ";  cin >> record; 
    } 
    hardware.close(); 
    output_Whole_File_Data(); 
    separation_line(); 
} 



void output_Whole_File_Data() 
{ 
    hardware.open("hardware.dat", ios::binary | ios::in); 
    output_Data_LineHead(); 
    hardware.read(reinterpret_cast<char *>(&myHardwareData), sizeof(HardwareData)); 
    int counter = 0; 
    cout << setprecision(2) << fixed; 
    while (hardware && !hardware.eof()) 
    { 
     if (myHardwareData.getRecord() != 0) 
      output_Data_Line(cout, myHardwareData); 

     hardware.read(reinterpret_cast<char *>(&myHardwareData), sizeof(HardwareData)); 
    } 
    hardware.close(); 
} 
+4

[ 'а' всегда неправильно (ВФ!)] (HTTP: // stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong). –

ответ

1

Попробуйте заменить

hardware.open("hardware.dat", ios::binary | ios::out); 

по

hardware.open("hardware.dat", ios::binary | ios::out | ios::app); 
+0

Однако, если я хочу изменить имя инструмента записи 3 с помощью choice_2, он добавит новую строку данных записи в конец файла. Кроме того, требуется сохранить 100 записей в файле. Некоторые из записей равны 0, поэтому он не будет отображаться. Если используется приложение ios ::, будет более 100 записей. Спасибо. – Casper

+0

@CasperLi Если вы не открываете для добавления, файл обрезается. – molbdnilo

+0

iso :: out удаляет все мои данные в каждом hardware.open (... iso :: out). Любые другие альтернативы могут заменить iso :: out? – Casper

Смежные вопросы