2016-02-17 116 views
-1

在我的程序中,我應該逐行讀取文本文件並搜索最長的迴文並返回其行號。如何讀取從.txt文件到char數組的空行

每個文本文件都長着的15

一個最大長度隨着我的代碼100,000行,我能看懂每一行到

char lines[100000][15] 

除了其甩開空行我計算哪一行包含最長的迴文。

例如包含文件:(0:是線0,1:第1行,等。)

0: hello 
1: bob 
2: joe 
3: 
4: cat 

出來作爲:

0: hello 
1: bob 
2: joe 
3: cat 
4: (whatever 5: would be) 

這是我的代碼用於讀取文件:

std::ifstream theFile; 
theFile.open(argv[1]); 

char lines[100000][15]; 
for (int i = 0; i < 100000; i++) 
{ 
    for (int j = 0; j < 15; j++) 
    { 
     lines[i][j] = '\0'; //I do this to initialize each char to null 
    } 
} 

while (!theFile.eof()) 
{ 
    for (int i = 0; i < 100000; i++) 
    { 
     theFile >> lines[i]; 
    } 
} 

我假設的問題是與線:

theFile >> lines[i]; 

不復制換行符或其他格式化字符,但我不知道如何解決此問題,所以任何幫助,將不勝感激。

我必須使用char數組的數組,因爲我使用MPI來傳遞數據,我只能發送字符而不是數組/字符串。

+0

好吧,我這樣做了,謝謝你的建議 – schwingms

回答

1

嘗試getline函數來代替(固定循環)這樣

for (int i = 0; theFile.getline (lines[i],14) && i < 100000; i++) 
    ; 
+1

請仔細閱讀[爲什麼使用EOF是錯誤的(http://stackoverflow.com/questions/5431941/why-is-while-feof-file-總是錯誤的)。如果您要推薦一個文件讀取循環,請正確執行。 –

+0

公平點...固定 – Soren

0

getline有一個版本,在那裏你可以指定分隔符。遇到新行時,默認版本會出現故障,因此請勿使用該行。

0

你不需要保留所有的字符串在內存中。一次只讀一行。如果該行是迴文序列,並且比迄今爲止所見到的最長的一行更長,請存儲它的長度和行號。然後碰撞線計數器。這樣的事情:

long line_number = 0; 
int longest_length = -1; 
long longest_number = -1; 
std::string line; 
while (theFile.getline(line)) { 
    if (is_palindrome(line) && longest_length < line.length()) { 
     longest_length = line.length(); 
     longest_line = line_number; 
    } 
    ++line_number; 
} 
0

我放棄了試圖將它們直接放入char數組數組中。我改用了getline和vector。

std :: ifstream theFile; theFile.open(argv [1]);

std::vector<std::string> Lines; 
std::string workString; 
while(std::getline(theFile,workString)) 
{ 
    Lines.push_back(workString); 
    workString.clear(); 
} 
theFile.close(); 

char lines[100000][15]; 
for (int i = 0; i < 100000; i++) 
{ 
    for (int j = 0; j < 15; j++) 
    { 
     lines[i][j] = '\0'; 
    } 
} 


for (int i = 0; i < 100000; i++) 
{ 
    for (int j = 0; j < Lines[i].size(); j++) 
    { 
     lines[i][j] = Lines[i][j]; 
    } 
}