2016-09-27 26 views
-3

首先,我根本不瞭解C++。基本上我有一個文件,看起來像讀取未知行數並將值存儲在數組中的C++

junk 
junk 
... 
junk 
3 4 5 1 
-9 7 4 -7 
8 6 3 1 
.... 
junk 
junk 
7 5 2 -1 
.... 
-1 7 4  1 
etc. 

我想要分別分析每個數字塊。即在這裏我有兩個數字塊,並希望分別對它們執行相同的分析。

我知道我將如何在Python中實現這一點,我只是不知道它在C++中的外觀。

file = open('data.text') 
w = []  
x = [] 
y = [] 
z = [] 

for line in file: 
    line = line.strip() 
    data = line.split() 
    w.append(data[0]) 
    x.append(data[1]) 
    y.append(data[2]) 
    z.append(data[3]) 
file.close() 

我也想對數字塊進行分析,一次比較兩行的所有可能性。在Python它會看起來像(我猜 - 沒有嘗試過):

r = [] 
s = [] 
t = [] 
for i in range(len(w)): 
    for j in range(len(w) - 1): 
    r.append(w[i]*x[j] - w[j]*x[i]) 
    s.append(x[j]*y[i] - y[j]*x[i]) 

for i in range(len(w): 
    for j in range(len(s)): 
    t.append(s[j]*w[i] + r[j]*x[i]) 
best = min(t) 

這裏有一對夫婦的我已經在C++中嘗試這一問題:我不知道的行數對於數據(稱爲n),雖然我知道我想分析的數字塊的數量(稱爲N - 在我的例子中N = 2)。和大量的分段錯誤。我想我可以存儲這些數據,但我似乎無法調用它。我創建一個類數據數據並從那裏開始工作。

double get_data = 0; 
for (std::string line; (std::getline(file,line));) 
    { 
    std::istringstream row(line); 
    Data data; 
    row >> data.w >> data.x >> data.y >> data.z; 

    std::vector<double> wcol; 
    std::vector<double> xcol; 
    std::vector<double> ycol; 
    std::vector<double> zcol; 

get_data++; 

for (int j = 0; j < get_data - 1; j++) { 

    if(data.w > 0) 
{ 

     wcol.push_back(data.w); 
     xcol.push_back(data.x); 
     ycol.push_back(data.y); 
     zcol.push_back(data.z); 

    } 
get_data = 0; 
} 

但我再也不知道我在用C++做什麼。


也許這應該是一個獨立的問題,但我也想打出來的分析,然後重新啓動對數字的下一塊。

+0

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

+0

爲什麼用'python'標記? –

+0

因爲我在裏面寫了一些例子python,所以我用Python標記了它。對不起,如果我使用錯誤的標籤。 @πάνταῥεῖ,相信我,我已經嘗試過。我搜索了以前的stackoverflow問題,並在過去的四天裏看過我的調試器 - 這是我所取得的所有進展。我提供的示例代碼編譯得很好,併產生了分段錯誤。這是經過幾個小時的調試並獲得編譯的代碼。在這一點上,我百分之百的輸了。這不是一個「小」的計劃 - 我只提供了我正在做的一件事。我正在做的其他事情。 –

回答

1

要從文件中讀取未知數量的文本行,請使用動態容器。

std::string text_line; 
std::vector<std::string> file_text; 
while (std::getline(data_file, text_line)) 
{ 
    file_text.push_back(text_line); 
} 

這不是最有效的方法。

對於一種有效的方法,問問自己,你是否必須將所有行讀入內存。大多數應用程序不需要;他們可以一次讀取一行並處理它。研究還包括:「內存映射」,「雙緩衝」和「將文本文件讀入緩衝區」。

另一種搜索:「C++讀取空格分隔的文本文件編號」或「C++讀取空格分隔的數組」。

相關問題