2012-03-19 8 views
2

次のコードは、入力からレコードを読み込み、file.datというファイルに格納することになっています。次に、これらのレコードを昇順に並べ替えることになっていますが、何らかの理由で、プログラムが2行目のwhileループwhileループ "file1.seekg( - (sizeof(r))、std :: ios :: cur);"でハングします。誰かが間違っていることを教えてもらえますか?何らかの理由でプログラムがハングする

#include <iostream> 
#include <fstream> 
#include <strstream> 

int main() 
{ 
std::ofstream file; 
file.open("file.dat",std::ios::trunc|std::ios::binary); 
if(!file) 
    std::cout<<"unable to open for output"; 

struct record 
{ 
    char code[6]; 
    char name[20]; 
    int i; 
}; 

record r; 
int a = 0; 

while(1) 
{ 
    std::cout<<"Record " << a + 1 << std::endl; 
    std::cout<<"Enter character code, name and an int \n"; 
    std::cin.ignore(); 
    std::cin.getline(r.code,6); 
    std::cin.getline(r.name,20); 
    std::cin>>r.i; 
    file.write((char *)&r,sizeof(r)); 
    std::cout<<"\nAdd another (y\\n) : "; 
    char c; 
    std::cin>>c; 
    if(c == 'n') 
     break; 
    a++; 
    std::cout<<'\n'<<'\n'; 
} 
file.close(); 

std::fstream file1("file.dat",std::ios::in|std::ios::out|std::ios::binary); 
if(!file1) 
    std::cout<<"unable to open file1"; 

else 
{ 
    if(a>0) 
    { while(a) 
     { 
      file1.seekp(0); 
      for(int i = a; i>0;i--) 
      { 
       record r1; 
       file1.read((char *)&r,sizeof(r)); 
       file1.read((char *)&r1,sizeof(r1)); 
       if(r1.i < r.i) 
       { 
        file1.seekp(-(sizeof(r)*2),std::ios::cur); 
        file1.write((char *)&r1,sizeof(r)); 
        file1.write((char *)&r,sizeof(r)); 
        file1.seekg(-(sizeof(r)),std::ios::cur); 
       } 
      } 

      a--; 
     } 
    } 
    file1.close(); 
} 

std::ifstream file2("file.dat",std::ios::binary); 
if(!file2) 
    std::cout<<"unable to open file2"; 
    else 
while(1) 
{ 
    std::cout<<"\n\n"; 
    file2.read((char *)&r,sizeof(r)); 
    if(file2.eof()) 
     break; 
    std::cout<<r.code<<'\t'<<r.name<<'\t'<<r.i; 
} 
} 
+2

に行きたい場合は、ハングどこで知っていますか?この情報は参考になります。さらに、サンプルコードサイズを最小限に抑えることもできます。 – heinrich5991

+1

デバッガを使用してコードをステップ実行します。それはそれのためのものだ... – trojanfoe

+0

'std :: get.ignore'それは何ですか? –

答えて

2

最初

変更のstd :: get.ignore - >のstd :: cin.ignore()

使用すると、1つの文字を破棄したい場合。

それがうまくコンパイルとFILE.DATファイルを作成した。..

あなたは、その後、実際のdatの後に入力された改行文字を無視しようとしている場合は、

2

かかわらFILE.DAT内のレコードをチェックするかもしれませんあなたが使用する必要があります:

std::cin.ignore(); 

あなたがignoreの使用方法の詳細を参照このLINK

+0

申し訳ありません、私の部分ではタイプミスでした。私は投稿を編集しました...プログラムが2番目のwhileループwhile" file1.seekg - (sizeof(r))、std :: ios :: cur); "となります。 Plzヘルプ。 – user1232138

+0

他のユーザーがあなたを助けることができるように質問を更新してください –