-1

在我的程序中,我应该逐行读取文本文件并搜索最长的回文并返回其行号。

每个文本文件长 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];

不复制换行符或其他格式字符,但我不知道如何解决这个问题,所以任何帮助将不胜感激。

我必须使用一个字符数组数组,顺便说一句,因为我使用 MPI 来传递数据,我只能发送字符而不是数组/字符串。

4

4 回答 4

1

像这样尝试 getline 函数(并修复循环)

 for (int i = 0; theFile.getline ( lines[i],14) && i < 100000; i++)
    ;
于 2016-02-18T00:11:40.217 回答
0

getline有一个版本,您可以在其中指定分隔符。默认版本在遇到新行时会弹出,所以不要使用它。

于 2016-02-18T00:14:01.350 回答
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;
}
于 2016-02-18T00:33:40.393 回答
0

我放弃了尝试将它们直接放入 char 数组的数组中。我这样做了,使用 getline 和 vector。

std::ifstream 文件;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];
    }
}
于 2016-02-18T00:39:39.760 回答