2016-11-29 138 views
-2

我一直有一些問題與我的代碼。我被要求將.dat文件中的元素輸入到數組中。對於課程,我們必須爲各種文件執行此操作,而不必知道每個文件中將包含多少個元素。我們唯一知道的是,每個文件的永遠不會超過5000個元素。輸入元素不同於輸出元素從文件C++

我的一個輸入文件中有如下內容:

5.675207 -0.571210 
0.728926 0.666069 
2.290909 0.751731 2.004545 0.907396 
0.702893 0.646427 5.909504 -0.365045 
2.082645 0.871841 5.597107 -0.633507 
6.117769 -0.164663 6.091736 -0.190282 
5.571074 -0.653433 4.503719 -0.978307 
3.983058 -0.745620 
3.670661 -0.504729 
5.857438 -0.413001 

當我運行我的代碼:

#define _CRT_NONSTDC_NO_DEPRECATE 
#include <iostream> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main(int argc, char * argv[]) 
{ 
ifstream fin; 
ofstream fout; 

if (argc < 3) 
{ 
    cout << "Incorrect usage: prog.exe filenname number" << endl; 
    cout << "Exiting now, please try again." << endl; 
    return -1; 
} 

fin.open(argv[1]); 
if (!fin) 
{ 
    cout << "Error opening file \"" << argv[1] << "\", exiting." << endl; 
    return -1; 
} 

fout.open(argv[2]); 

int count = 0; 
int word; 
double points[5000]; 

while (fin >> word) 
{ 
    fin >> points[count]; 
    ++count; 
} 

fout << "Numer of points is: " << count/2 << endl; 

for (int i = 0; i < count; i++) 
{ 
    fout << points[i] << " "; 
} 

fin.close(); 
fout.close(); 

return 0; 
} 

我輸出的元素只是爲了確保他們得到適當的輸入。我得到以下,我不知道爲什麼。

0.675207 0.57121 
0.728926 0.666069 
0.290909 0.751731 0.004545 0.907396 
0.702893 0.646427 0.909504 0.365045 
0.082645 0.871841 0.597107 0.633507 
0.117769 0.164663 0.091736 0.190282 
0.571074 0.653433 0.503719 0.978307 
0.983058 0.74562 
0.670661 0.504729 
0.857438 0.413001 

第一個數字被轉換成0由於某種原因和消極的變爲正。誰會知道爲什麼會發生這種情況?

+2

您應該學習如何使用調試器並逐步完成代碼。 – 2016-11-29 00:16:22

+0

解決這些問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

您正在讀取流中的項目兩次(交替爲'word'和'points [count]')。 –

回答

0
int word; 

對你沒有好處。首先它是一個整數,所以fin >> word只讀取輸入的整數部分。 5.675207被讀爲5..675207保留在文件流fin >> points[count]中。單詞不會被存儲到任何地方,而是被丟棄,但.675207在points[0]中依然存在0.675207。

凡負號去我沒有理會試圖找出原因

while (fin >> points[count]) 
{ 
    ++count; 
} 

修復一切。

0

當您從文件中讀取數字時,您將它們解壓爲「單詞」,然後將它們存儲爲「點」。 「word」是一個整數,「points」是一個double,這會給你意想不到的行爲。編譯器應該給你關於這個的警告。

+0

還應該指出,他從「fin」中讀取了兩次,這幾乎不是他想要的 – artm

+0

還應該指出不要假設用戶的性別 – Harper

+0

我將「單詞」更改爲雙精度,但是我將其他所有元素都加入到了我的文件中。它還將小數點前的第一個數字更改爲0 –