2016-02-17 78 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]; 
    } 
}