数値を含むテキストファイルのC ++読み込み

私は16行の整数のtxtファイルを持っています。各行には5つの整数が含まれています。ここにはファイルの最初の4行、

0 0 0 0 0

     

1 2 3 4 5

     

5 4 3 2 1

     

5 100 1000 10000 10500

私は一度に1行を読み込み、配列に5つのintをすべて格納し、次に最大値を見つける必要があります。私は自分自身でこれを行うことができます。私が問題を抱えているのは、前の行を読み終えたら、ファイルの次の行に行きます。

  1. テキストファイルの最初の行を読み込みます

  2. 数値を配列に格納する

  3. 配列内の最大の整数を返す関数に配列を送ります。

  4. 返された数値を新しい配列に配置します。最終的には、ファイルの16行すべての中で最大の数が入ります。

  5. ファイルの次の行を読み込みます

  6. 16のint配列を持つ配列をファイルに書き出します

私はステップ5で問題を抱えています。コードを実行するたびに、毎回1行目が読み込まれます。

#include 
#include 
using namespace std;

int main()
{
    int n,i,j;
    int temp[5];
    //ask user
    cout<<"How many lines are in the file\n";
    cin>>n;
    int *array = new int[n];
    //open file
    ifstream inFile;
    inFile.open("input.txt");

    for(j=0;j> temp[i];
            cout<

ご覧のとおり、最大値検索機能はまだありません。実際のデータを分析する前に、ファイルをどのように読んでいるのかを修正したいと思います。

はい、これは数日後の宿題プロジェクトですが、私の先生はファイルの読み方について説明していないし、教科書の説明を読むように教えてくれました。私は宿題を渡すだけではなく、簡単な説明や欠けていることの例を学びたいと思っています。

0

3 答え

istream :: getline()を使用して、一度にすべての行を取得します結果の文字列を解析します。その後、getline()をもう一度呼びます。それはあなたがおそらくエンドラインの文字を読んでいないからですが、なぜあなたが正確な振る舞いをしているのかはわかりません。

1
追加された
@Will私がリンクしているドキュメントページをチェックしてください。引数は、入力文字列、読み込む最大文字数、および使用する区切り文字(オプション)を保持するchar配列へのポインタです。
追加された 著者 Matt Phillips,
@Will strtok()をご覧ください。これにより、Cの文字列を個々の数字に分解することができます(次にatoiや何かを整数に変換する)。説明は少し混乱しますが、サンプルをテンプレートとして使用すると、そのサンプルを機能させることができます。
追加された 著者 Matt Phillips,
@ウィルこれは私があなたに与えた答えです。inFile.getline()を呼び出してください。
追加された 著者 Matt Phillips,
1行目はistream :: getline(0)ですか?または(1)その機能は価値をも取らないか?
追加された 著者 Will Gunn,
ありがとう、私は本当にC + +を開始している(私はCのまともな理解を持っている)と私は文字列getlineを解析する方法がわからない私の数字にあなたを与える。
追加された 著者 Will Gunn,
助けてくれてありがとう、そして、私はその方法がより洗剤になるかもしれないが、ifFileがifstreamから次の行を読む方法を知っていますか?
追加された 著者 Will Gunn,
ありがとう、私はそれを試してみましょう。
追加された 著者 Will Gunn,

あなたのコードは私のために正常に動作します。私は、ファイルを開くことに問題があると信じているので、temp []要素が初期化されたときにそれらを出力し続けます。読み込み中にinFile状態を取得しようとします。

1
追加された
それは私がすでにやっていることです。私の最終的なプログラムでは、各番号を読み込みとして出力しません。私はデバッグの目的でそれを入れます。私があなたを誤解していない限り、それは私がinFile >> temp [i]を持っている理由です。 cout << temp [i] << "";
追加された 著者 Will Gunn,
tempの初期化を取り除き、cout \ nで追加したので、ターミナル内の各行の出力をまとめずに表示しています。出力は変更されましたが、16行すべてがこれを示します。0 0 1880267544 32654 1
追加された 著者 Will Gunn,
チェックのためにtempの直後にcoutループを追加しました。そして、それは最初の値なので、私の問題はファイルで正しく読み込まれていないと思いますか?
追加された 著者 Will Gunn,
助けてくれてありがとう、私は完全なファイルパスを入れて、私の元のコードは動作しています:)
追加された 著者 Will Gunn,
あなたの出力はあまり説明されていません。最初のtemp []の値は最初の行の内容と似ています。一時的な[]を{-1}で初期化してみてください。これは実際にもっと多くのものを表示します:) UPD:変更が何も変更されない場合、使用しているプラ​​ットフォームと開発者ウェアに関する情報を私に提供してください。 。
追加された 著者 Igor Shalyminov,
これらの値がtemp []の初期値でないことを確認するために、ちょうど最初にもう1つの出力を追加しました。 fscanf()を試してみてください。
追加された 著者 Igor Shalyminov,
まったく。完全なファイル名を指定するか、アクセス権を修正してみてください。
追加された 著者 Igor Shalyminov,

まあ、私はあなたが配列が必要とは思わない。 1行ずつ読み込み、トークン化し、それぞれをintに静的にキャストします(0から9までのアスキー値を調べて、慎重にチェックし、ネガをチェックします)。 EOFまで繰り返すと、最も効率的なソリューションが得られる可能性があります。

だからステップは

1)一時的な文字列を宣言します。

2)行を読む

3)スペースをトークン化する

4)最初のものが最大値であると仮定する。読んで比較を続ける。大きな値を見つけたら値を入れ替えてください

5)最後まで繰り返す

0
追加された