0

課題はテスト採点者を作ることです。ファイルの最初の行はすべての回答で、次の行は生徒の名前 (LAST、FIRST) の間で交互に表示され、次の行の回答です。テスト キーの回答を渡すことはできますが、getline() 関数を使用しようとすると、配列の最初のインデックスに値が格納されず、cin.ignore() によってプログラムがフリーズするだけです。ここからどこへ行けばいいですか?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

typedef char answerKey[30];
typedef string studentNames[25];

int main()
{

    fstream inFile;

    inFile.open("xfile.txt");
    if (!inFile)
    {
        cout << "ERROR FILE NOT FOUND" << endl;
        return (EXIT_FAILURE);
    } else {

        for (int i = 0; i < 30; i++)
            inFile >> answerKey[i];

        getline(inFile, studentNames[0]);

        cout << studentNames[0];  
    }
}

出力はヌルです。

4

1 に答える 1

0

フォーマットされた I/O とフォーマットされていない I/O を交互に使用する場合、通常、先頭の空白を取り除く必要があります。フォーマットされた入力 (つまり、 を使用する場合operator>>()) は、先頭の空白をスキップします ( を使用してこれをオフにできますが、std::noskipwsほとんど役に立ちません)。一方、フォーマットされていない入力 ( など) はstd::getline()、先頭の空白をスキップしません。数値の書式設定された入力は、ストリーム内に数値以外の文字列 (スペースや改行など) があると停止するため、std::getline()が呼び出されたときに空白はそのまま残ります。回答のある行の終わりは、改行で明確に示されます。 . std::getline()この非常に改行で停止します。これはおそらく、文字が保存されておらず、改行のみが抽出されることを意味します。

先頭の空白を消費する最も簡単な方法は、std::wsマニピュレータを使用することです。次に例を示します。

if (std::getline(inFile >> std::ws, studentNames[0])) {
    // process the student name
}

(入力は常に失敗する可能性があるため、入力が成功したかどうかのチェックを省略することはできません)。

たとえば、改行までの空白をスキップし、その後の空白をスキップするなど、より適切な制御が必要な場合は、空白をスキップするためのカスタム アプローチが必要になります。とはいえ、どちらも難しいことではありません。

于 2013-11-01T20:53:44.803 に答える