0

文字列で構造化するテキスト ファイルの読み取りに問題があります。機能が停止するだけで、何もできません。

構造:

struct Ksiazka
{
        string autor;
        string tytul;
        int data;
};
struct Ksiazka * d = new Ksiazka[10];
int il;


ofstream zapis("biblio.txt", ios::app);
                    for(int i = 0; i < il; i++)
                    {
                        zapis << d[i].autor << " ";
                        zapis << d[i].tytul << " ";
                        zapis << d[i].data;
                        if(i<il-1) zapis << " \n";
                    }
                    zapis.close();       
ifstream odczyt;
                odczyt.open("biblio.txt");
                odczyt.seekg(0);
                il = 0;
                while(!odczyt.eof())
                {
                    odczyt >> d[il].autor;
                    odczyt >> d[il].tytul;
                    odczyt >> d[il].data;
                    il++;
                }
                odczyt.close();
4

2 に答える 2

0

STL I/O ストリームに関する私のペットの 1 つに噛まれている可能性が最も高いです。それらはタイプセーフではありません。

著者またはタイトルの文字列にスペースが含まれている場合 (ほとんどの場合そうです)、行を読んでいるときに、<< 演算子は空白 (スペース、タブ、改行) で引数を分割します。したがって、コードは文字列ではなく最初の2つの単語を単純に読み取り、その後に整数を読み取ろうとします。これがデータベースにあると想像してください:

George Orwell 1984 1949

次に、著者フィールドを読んだ後、「George」、タイトル「Orwell」、および年「1984」が含まれます。次の読み取りでは、著者フィールドに「1949」が入力されます...

残念ながら、STL では、<< および >> 演算子を使用して文字列をそのまま維持する簡単な方法はありません (特に文字列自体に改行が含まれている場合)。base64 エンコード/デコード、または urlencode/urldecode の使用を検討してください。

最後に 1 つ注意してください: 行を終了するためにリテラルを使用しないでください"\n" 。std::endl を使用してください。

于 2013-06-10T13:01:43.757 に答える
0

getline (odczyt,line) を使用します。この cout << line << endl; を確認します。構造体にロードする前に与えます

于 2013-06-10T11:43:40.673 に答える