2017-02-15 29 views
0

私のプログラムでは、数字のファイルを読み込もうとしています。私は最初の数字をとり、その数字を配列のサイズにしたいと思います。ファイルを閉じた後、同じファイルを再度開き、残りの数字を配列に格納したいと思います。配列では、バブルソートアルゴリズムを使用して数値をソートし、配列を昇順で表示したいと考えています。txtファイルを2回開くC++

int readData(int * arr); 
void bsort(int * arr, int last); 
void writeToConsole(int * arr, int last); 
void swap(int, int); 
int main() 
{ 
    ifstream inFile("data.txt"); 
    int arrSize; 
    inFile >> arrSize; 
    int * arr = new int[arrSize]; 
    inFile.close(); 
    readData(arr); 
    writeToConsole(arr, arrSize); 
    system("pause"); 
    return 0; 
} 
int readData(int * arr) 
{ 
    ifstream read("data.txt"); 
    int index = 0; 
    for(int i = 0; i < 10; i++) 
    { 
     read >> *(arr + index); 
     index++; 
    } 
    read.close(); 
    return *arr; 
} 
void bsort(int * arr, int last) 
{ 
    for (int i = last - 1; i >= 0; i--) 
    { 
     for (int j = 1; j <= i; j++) 
     { 
      //this block is constant with respect to array size 
      if (*(arr + (j - 1)) > *(arr + j)) 
      { 
       int temp = *(arr + (j - 1)); 
       *(arr + (j - 1)) = *(arr + j); 
       *(arr + j) = temp; 
      } 
     } 
    } 
} 
void writeToConsole(int * arr, int last) 
{ 
    bsort(arr, last); 
    for (int i = 0; i < last; i++) 
    { 
     cout << *(arr + i) << " "; 
    } 
} 
void swap(int x, int y) 
{ 
    int temp = x; 
    x = y; 
    y = temp; 
} 

つまり、初めてファイルを読み取るときに、格納されている数値が配列のサイズを表します。 2回目にファイルを読むと、最初の番号をスキップして次の番号に進みます。ファイルを読むとき、最初の番号をスキップするにはどうしたらいいですか?どんな助けでも大歓迎です。

ここで私が読みたいファイルの情報です:

9 

8 

4 

7 

2 

9 

5 

6 

1 

3 

答えて

0

、ファイルを読み込むサイズで読み、その後、再びそれを開き、それを閉じ、サイズをスキップするために、その可能性があり、内容を読んでください。しかし、それは奇妙なことです。ほとんどの人は、ファイルを開き、サイズを読み込み、データの領域を割り当て、データを読み込み、ファイルを閉じます。

通常、ファイルのデータのサイズを読み取る前にそれを知ることは便利です。 C++では、std :: vectorクラスがあなたのために拡張されるので、シーンの背後にあるすべてのフェッドメモリの再割り当てを行うほど、それほど重要ではありません。

抽出と挿入の演算子< < >>は、C言語では、おそらくC言語よりも多少使いやすくなりました。彼らが間違ってしまうと、何が間違っているのかを理解することが難しくなります。一般的には、ファイルを1行ずつ読み込むためにfopenとfgets()を使う初心者にお勧めします。そうすれば、行方不明やスキップされた文字に混乱することはありません。関数sscanf()はアスキー文字列を数値に変換しますが、デバッグ中に行を印刷して何が起こっているかを確認することもできます。

+0

領域を割り当てる方法上の任意のヒントをして、データを読んで?私は別のポインタ変数を作成することを考えていますが、それは非常に効果的ではないと思います。アドバイスをいただければ幸いです。ありがとう! –

0

C言語の代わりにC++を使用しているのであれば、C++言語と標準ライブラリの可能性をすべて使用することをお勧めします。あなたが望むことをやり遂げる方法はたくさんあります。ファイルに格納されているデータの形式によって異なります。しかし、どのような場合でも、標準ライブラリは、あなたの本当の問題に焦点を当て、ホイールを再構築しないために、多大な機能とユーティリティを提供します。私の場合は、この特定のI/Oの場合にこの解決策を考え出します。終わりに、私の強い推薦がされています。ドキュメントに移動して、より簡単な仕事をしたことが何かを探してみる

http://www.cplusplus.com/reference/

http://en.cppreference.com/w/cpp

#include <bits/stdc++.h> 
using namespace std; 

vector<int> read_data(const string file_name){ 

    ifstream inf(file_name); 

    istream_iterator<int> eoi, input(inf); 

    vector<int> arr(*input++);//take the first integer, the size, and advance the iterator 

    copy(input, eoi, arr.begin()); 

    return arr; 
} 

void bsort(vector<int>& data){ 
    //sort data like you want 
    sort(data.begin(), data.end()); 
} 

void write_to_console(vector<int>& data){ 
    //do your stuff 
    copy(data.begin(), data.end(), ostream_iterator<int>(cout," ")); 
} 

int main(void) { 
    string file_name = "data.txt"; 

    auto data = read_data(file_name); 

    bsort(data); 
    write_to_console(data); 

    return 0; 
} 
関連する問題