2017-02-04 23 views
0

私は最大40の名前(> 10文字)、姓(> 12文字)、ID#(常に6文字)、および6つの成績(最低のものを削除する必要があります)私は文字列ライブラリの使用を制限されています。C++ - get()を使用した後に文字を操作するにはどうすればよいですか?

ので、基本的にこのような何か(データの間にスペースと\ tのとはい、任意の量):

Adam Zeller 452313 78 86 91 64 90 76 

Barbara Young 274253 88 77 91 66 82  93 

Carl Wilson 112235 87 99 76 15 95 94 

Alec Burmeister 234689 45 76 98  54 12 8 

、最終的にそれが見えるように必要があります:

​​

私は現在、getline()、get()で多くの問題を抱えていますが、これらのいずれかを使用することができます(データを受け取るためにcin >>を使用することはできません...)

私は使用しようとしました両方とも、getline gi私は間違っているかもしれませんが、私はあまりにも多くのバグを抱えており、今のところ最も有望であるようです。

const int SIZE = 256; 

char student_list[SIZE]; 

char input_filename[40] = "student_input.txt", 
    output_filename[40] = "student_results.txt"; 

Student student[40]; // I want to use a struct, but still trying to figure 
        // out how to make the characters into variables so       
        // that I can manipulate the values. 
fstream fin; 
fin.open(input_filename, ios::in); 

if(fin.fail()) 
{ 
    cout << "ERROR - COULD NOT FIND INPUT FILE \n\n"; 

    return 1; 
} 

char c; 
while (fin.get(c))   // loop getting single characters 
{ 
    if((c == ' ')) 
     c = '\b'; 
    else if(c == '\t') 
     c == '\b'; 
    else 
     cout << c; 
} 

cout << "\n\nProgram successfully terminated!\n"; 

fin.close(); 

return 0; 

私は、これは私だけの出力を取得するので、このコードは、少し欠陥がある知っているが、それは私もそれを期待してどのように動作しますが...それだけのすべてを取り出す:

私は現在、これを持っていますスペースと\ t。そして、私のすべてのデータがあります(唯一の彼ではなく、誰でも他の人の...アダムZellers'行の最後の値を食べたgetlineのと比較して、なぜIDKの。)

AdamZeller452313788691649076 

BarbaraYoung274253887791668293 

CarlWilson112235879976159594 

AlecBurmeister23468945769854128 

私が手出力だことが、私は配列ではなくchar cを使用しているので、値を取って外に出力することはできません。それに、配列を使うことができても、各名前と姓が違うので、それはうまくいきません。

とにかく、私はこれをしていますそれよりも複雑な、または私は正しい道にいますか?文字列ではなく個々の文字であるため、各個別の文字を操作する方法や、文字の各セット(名前、最後、ID、等級)を変数に格納する方法はわかりません。

+0

'std :: getline'を使って行全体を読み込み、' std :: istringstream'に '>>'を使用できますか?練習の目的は何ですか?どのように文字列に追加し、文字シーケンスから数値を作成するのですか?それ以外の場合、私は本当に有用な目的を見逃す。 –

+0

@Someprogrammerdude私は誠実に目的を知らない。そして、彼は、>>演算子を使ってファイルから入力を得ることができないと述べているので、私はそれを行うことはできません。 – Nano

答えて

0

あなたは、空間分離に基づいて解析することによってあなたの人生を簡素化することができます:

std::string first_name; 
std::string last_name; 
int values[7]; 

while (fin >> first_name) 
{ 
    fin >> last_name; 
    for (unsigned int i = 0U; i < 7; ++i) 
    { 
    fin >> values[i]; 
    } 
} 

より良い方法は、構造体の構造や過負荷operator>>にすべてのこれらの変数を配置することです。

また、アレイをstd::vectorに変更してください。配列は、テキスト行の数が常に同じ場合に便利です。

+0

これはひどいコードです。常に読み取り操作の戻り値をテストする必要があります。 –

+0

@NeilButterworth:はい、読み取り操作をテストする必要があります。しかし、以前の読み込みが失敗した場合、それ以降の読み込みは失敗します。 –

+0

しかし、あなたはまだループします。そして、あなたは無効な値の完全な配列で終わるでしょう。このようなコードを書くことについては言い訳がありません。 –

関連する問題