2013-04-27 69 views
1

我只需要一點幫助文件解析。我們必須解析以格式,每行6個項的文件:C:使用substr解析文本文件

「字符串1」,「字符串2」,「STRING3」,「串,4」,「STRING5」,「string6」

我的教練最近給了我們一小段代碼作爲「提示」,我應該使用它。不幸的是,我無法弄清楚如何讓它起作用。這是我的文件解析功能。

void parseData(ifstream &myFile, Book bookPtr[]) 
{ 

    string bookInfo; 
    int start, end; 
    string bookData[6]; 

    getline(myFile, bookInfo); 
    start = -2; 

    myFile.open("Book List.txt"); 

    for (int j = 0; j < 6; j++) 
    { 
     start += 3; 
     end = bookInfo.find('"', start); 
     bookData[j] = bookInfo.substr(start, end-start); 
     start = end; 
    } 



} 

所以我試圖將6個字符串讀入一個字符串數組。有人能幫助我完成整個過程嗎?

+1

你的老師給了你那段代碼。我建議你改變課程,因爲這是一個非常糟糕的方式去做。 – 2013-04-27 17:39:32

+0

我同意詹姆斯。我已經列出瞭解析引用字符串多行文件的「更好」方法。這並不完美,但它遠比教練給你的「提示」要好得多(這是一個「暗示」可以肯定的問題,但與熟練程度有關,而不是解決這個特定問題)。 – WhozCraig 2013-04-27 18:02:26

回答

1
start = -2; 
for (int j = 0; j < 6; j++) 
{ 
    start += 3; 
    end = bookInfo.find('"', start); 
    bookData[j] = bookInfo.substr(start, end-start); 
    start = end; 
} 

所以", "是四個字符。前導收盤價是在開盤收盤價後面3個字符。

進入循環start指向最後的結束報價。 (在第一次進入循環是僞造爲-2是指向虛「-1th」元素的收盤報價。)

所以我們從最後收報價前進到開盤後報價:

start += 3; 

然後我們使用的std :: string ::找到找到收盤報價:

end = bookInfo.find('"', start); 

偏移告訴它忽略所有字符,直到幷包括該位置。

然後,我們有兩個引號位置,start..end,所以我們使用substr提取字符串:

bookData[j] = bookInfo.substr(start, end-start); 

然後我們下一個循環是最後結束引號更新開始:

start = end 
0

請爲了你自己,創造一個最小的例子。這開始於一個字符串,就像你給出的例子的行,並以數組中的不同部分結束。現在離開文件加載,getline()似乎爲你工作,或?然後,不要在函數的開頭聲明你想要使用的每個變量。這不是古老的C,你只需要這樣做或引入額外的{}塊。還有一件奇怪的事,那就是Book bookPtr[]。這實際上只是一個Book* bookPtr,即你不是將一個數組傳遞給一個函數,而只是一個指針。不要因爲這個誤導性的語法而失敗,這是一個謊言!無論如何,無論如何,你似乎都不會使用該指針指向未知類型的對象。

關於將行分割爲字符串,一種方法是找到雙引號對。它們之間的一切都是字符串之一,沒有任何東西是無關緊要的。字符串類有一個find()函數,它可以選擇一個起始位置。起始位置始終位於先前找到的位置後面。

您上面的代碼似乎假定只有一個雙引號,逗號,空格和另一個雙引號將兩個字符串分開。這不是100%清楚,我也準備好處理多個空間或根本沒有空間。此外,逗號是否有保證?雙引號是否有保證?無論如何,保持簡單。除非您對輸入有更好的規範,否則只是假設只有引號之間的部分是不同的。

那麼,究竟什麼工作,什麼不是?您需要提出更具體的問題並提供更詳細的信息。上面的代碼看起來本身並沒有破壞,儘管有一些東西有點不合適。例如,您通常不會將ifstream傳遞給函數,而是使用istream基類。在你的情況下,你從該文件中讀取一行,然後使用相同的fstream對象打開另一個文件,這對我來說是沒有意義的,因爲之後不使用它。如果你只在本地需要這個流,你可以在那裏創建並打開它(當然是處理錯誤!)並且只傳入文件名作爲參數。