2016-10-17 222 views
0

以下是我的C++代碼的一部分,argv[2]是輸入文件的路徑。 我發現雖然我在輸入文件中得到了正確數量的元素(arr_size),但while循環中的代碼似乎沒有被執行。結果是arr[]中的所有元素保留其原始值(0)。C++,從文件中讀取一個數字的數組

ifstream inFile(argv[2]); 

// get the number of element 
int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>()); 

int * arr = new int[arr_size]; 

int idx(0); 
while (inFile >> arr[idx]) { 
    idx++; 
} 

我已經試過

while (!inFile.eof()) { 
    inFile >> arr[idx]; 
    idx++; 
} 

,但仍得到相同的結果。

輸入文件就像如下:

3 8 7 4 6 2 1 9 0 5 

這有什麼錯我的代碼?

+0

'arr_size'的值是什麼? – NathanOliver

+0

值爲10. – zbqv

+0

嘗試在Internet上搜索「stackoverflow C++讀取文件數組」。我們真的不需要更多這些「相似但不完全相同」的問題。 –

回答

1

在這條線

int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>()); 

文件已經被讀取結束。

您必須重置ifstream使用seekg(0)開始再次閱讀它。

還可以使用while循環的第一個版本,更好地使用std::vector<int>push_back()而不是自己管理內存。

0

我強烈建議改變你的代碼中使用std::vector

std::vector<int> database; 
int datum = 0; 
while (my_data_file >> datum) 
{ 
    database.push_back(datum); 
} 

這消除了確定一個文件編號的數量的討厭的問題,那麼分配的內存(正確),並傳遞指針量,最後刪除內存。

1

的這裏的問題是,當你做

int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>()); 

你居然讀文件,以確定有多少次istream_iterator可以提前。這種測量,當你從文件中讀入數組時,你已經在文件的末尾了,什麼都不會被讀取。

爲了解決這個問題,你要麼需要尋求迴文件的開頭或不使用newdelete使用的std::vector

std::vector data(istream_iterator<int>(inFile), istream_iterator<int>()); 

現在你有一個完整的文件內容載體。

1

我懷疑電話

int arr_size = distance(istream_iterator<int>(inFile), istream_iterator<int>()); 

把​​底。

你需要使用seekg

// Clear the state of the stream before calling seekg. 
inFile.clear(); 
inFile.seekg(0); 

應該這樣做重置它指向的開始。

+1

在seekg()之前,流狀態需要被清除():當流處於失敗狀態時,它將忽略大多數請求。 –

+0

@DietmarKühl,謝謝你。我同意。 –

0

std::istream_iterator<T>輸入迭代器:您可以遍歷序列一次。遞增輸入迭代器會消耗相應的元素。你需要一個更強大的迭代器,例如轉發迭代器來遍歷序列多次。

如果你的輸入流是一個實際的文件,你可以再次打開它或clear()流,然後seekg()到流的開始再次讀取它。我親自將它讀取到一個單一的存儲元素到一個適當的可調整大小的陣列,可能是std::vector<T>

請注意,您的第一個循環是讀取元素的首選方法(當不使用迭代器時)。使用eof()是錯的!您肯定需要在之後檢查流的狀態嘗試讀取流。