在我的程序中,我应该逐行阅读文本文件并搜索最长的回文并返回其行号。
每个文本文件长度为100,000行,最大长度为15。
使用我的代码,我能够将每行读入
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 :(得分:1)
尝试使用getline函数(并修复循环),如下所示
for (int i = 0; theFile.getline ( lines[i],14) && i < 100000; i++)
;
答案 1 :(得分:0)
getline有一个版本,您可以在其中指定分隔符。当遇到新行时,默认版本会突然出现,所以不要使用它。
答案 2 :(得分: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;
}
答案 3 :(得分: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];
}
}