2017-02-15 184 views
0

在我的程序中,我試圖讀取一個數字文件。我想採取第一個數字,並將該數字作爲我的數組大小。關閉文件後,我想重新打開相同的文件並將其餘數字存儲到數組中。在數組中,我想使用冒泡排序算法對數字進行排序並按升序顯示數組。打開一個txt文件兩次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; 
} 

換言之,第一次讀取的文件時,存儲將表示我的陣列的大小的數目。第二次閱讀文件時,我想跳過第一個數字並繼續下一個數字。閱讀文件時,如何跳過第一個數字?任何幫助將不勝感激。

下面是該文件,我想信息閱讀:

9 

8 

4 

7 

2 

9 

5 

6 

1 

3 

回答

0

它可以讀取文件,在大小讀取,然後將其關閉,然後再次打開它,跳過大小,閱讀內容。但這是一件很奇怪的事情。大多數人會打開文件,讀取大小,爲數據分配空間,讀取數據,然後關閉文件。

在C中,通常很容易在讀取文件之前知道文件數據的大小。在C++中,它不像std :: vector類爲你擴展一樣重要,在後臺執行所有重複的內存重新分配。

提取和插入運算符< < >>在C++中,當一切正常時,C++可以說比C版更容易使用。當他們出錯時,很難理解出了什麼問題。通常我建議新手使用fopen和fgets()逐行讀取文件。這樣你就不會被丟失或跳過的字符所迷惑。函數sscanf()會將一個ascii字符串轉換爲一個數字,但您也可以在調試時打印該行,以確定發生了什麼。

+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; 
}