2014-11-05 4 views
-4

Эта программа работает, но печатает значения мусора в начале (ch = 2) и печатает тот же результат дважды. Я использую это для своего проекта. Он содержит больше данных, и там я использовал один объект вместо массива объектов. Он не работал. Каждый объект массива хранит набор данных.Ошибка при чтении и записи в файлах

#include<iostream> 
    #include<fstream> 
     using namespace std; 
     class rw    //a class containing some data 
     { 
      public: 
      int n; 
      char a; 
      }; 
     int main() 

     { 
      int i; 
      rw r[2];   //an array of objects 
      int ch; 
      fstream f1; 
      f1.open("file1.txt",ios::in|ios::out|ios::ate); 
      cout<<"1-read,2-write"; 
      cin>>ch; 
      f1.seekp(0,ios::beg); 
      if(ch==1)//for saving 
      { 
        r[0].n=1; 
        r[0].a='a'; 
        f1.write((char*) &r[0],sizeof(r[0])); 
        r[1].n=2; 
        r[1].a='b'; 
        f1.write((char*)&r[1],sizeof(r[1])); 
        } 
      if(ch==2)//for reading 
      { 
        f1.seekg(0,ios::beg); 
      while(!f1.eof()) 
      { 
          i=0; 
          cout<<r[i].n<<r[i].a; 
          cout<<"\n"; 
          f1.read((char*)&r[i],sizeof(r[i])); 
          i++; 
          } 
          } 
          system("pause"); 
          return 0; 
          } 
+0

Что значит «не работает», пожалуйста, можете ли вы подробно остановиться на этом? Сбой программы? Он просто не выписывает файл? – cybermonkey

ответ

0

Изменить следующий код

cout<<r[i].n<<r[i].a; 
cout<<"\n"; 
f1.read((char*)&r[i],sizeof(r[i])); 

в

f1.read((char*)&r[i],sizeof(r[i])); // Moved before printing 
cout<<r[i].n<<r[i].a; 
cout<<"\n"; 

Вы вывода данных, то чтение из файла, вместо этого вы должны прочитать и затем распечатать. Печать перед чтением является причиной получения мусора в первом запуске цикла. Я думаю, вы переместили показанное ниже, чтобы избежать двойной печати последней записи. Продолжайте читать, чтобы понять, как избежать двойного чтения.

Вам следует избегать использования while (!f1.eof()), так как он будет печатать последние данные дважды. Лучше использовать while(f1.read((char*)&r[i],sizeof(r[i])));

Развернув версию ВФ петли для 2 входов

while(!eof) // true 
read first data 
print first data 
while(!eof) // true 
read second data // read all, but was succesful and eof not set 
print second data 
while(!eof) // true 
Try to read // Could not read, eof set 
print data // Reprinting second data 
while(!eof) // false 
+0

Вы уже читаете 'while', поэтому вы не должны читать его снова внутри цикла. –

+0

Я удалил его .. теперь он сбой –

+0

Как завершается цикл? –

0

Не используйте while (!f1.eof()), он не будет работать, как вы ожидаете, потому что eofbit флаг не установлен, не до после вы пытаетесь читать из-за файла. Вместо этого, например, while (f1.read(...)).

Также будьте осторожны с такой петлей без проверки границ. Если файл неправильный, вы можете записать границы диапазона r.

+0

Это действительно должно быть комментарий, так как он не отвечает на вопрос (см. Ответ @ Mohit выше). – cybermonkey

+0

@cybermonkey Это не * полный * ответ на то, что он отвечает на оба вопроса OPs, потому что Mohits ответил на другой случай, но не на это (в момент, когда я пишу этот ответ). –

+0

Это еще не ответ, и, насколько я вижу, ОП задал только один вопрос (на самом деле вопрос не задавался!). – cybermonkey