0

コードのこの部分で苦労しているのですが、何を試しても、2行後にレコードに読み込むことができません

テキストファイルには

ミッキーマウス
12121
グーフィー
24680
アンディキャップ
01928
カジモド
00041
終わり

コードは

#include<iostream>
#include<string.h>
#include <stdio.h>
#include <windows.h>
#include<iomanip>
#include<conio.h>
#include<fstream>
#include<string>
using namespace std;

struct record          
{               
char name[20];
int number;
 };



void main()
{


record credentials[30];
    int row=0; 
fstream textfile;//fstream variable
textfile.open("credentials.txt",ios::in);
textfile.getline (credentials[row].name,30);
//begin reading from test file, untill it reads end
while(0!=strcmp(credentials[row].name,"end"))
{ 

    textfile>>credentials[row].number;

    row++;
    //read next name ....if its "end" loop will stop
    textfile.getline (credentials[row].name,30);
}
textfile.close();

}

レコードは最初の2行だけを取り、残りは空です。

4

1 に答える 1

5

問題はそれです:

textfile>>credentials[row].number;

改行文字を消費しませんが。textfile.getline()空白行を読み取るための後続の呼び出しと次の呼び出し:

textfile>>credentials[row].number;

に読み込もうとして失敗し、ストリームのフェイルビットを設定します。これは"Goofy"、それ以降のすべての読み取りが失敗することを意味します。戻り値を確認して、障害を検出します。inttextfile

if (textfile >> credentials[row].number)
{
    // Success.
}

プログラムがどのように終了するかは完全にはわかりませ"end"んが、配列の終わりのオーバーランを防ぐメカニズムがないためcredentials(つまりrow < 30、ループ終了条件の一部としてではないため)、プログラムが異常に終了する可能性があります。


他の:

  • 名前を読み込むために固定サイズを使用する代わりに、char[]次を使用できますstd::getline()

    #include <string>
    
    struct record
    {
        std::string name;
        int number;
    };
    
    if (std::getline(textfile, credentials[row].name))
    {
    }
    
  • 固定サイズを使用する代わりに、必要に応じて大きくなるをrecord[]使用できます。std::vector<record>

于 2012-09-21T10:32:15.113 に答える