【问题标题】:How do I read in blank lines from a .txt file to a char array如何从 .t​​xt 文件中读取空行到 char 数组
【发布时间】:2016-05-29 22:36:22
【问题描述】:

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

每个文本文件长 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 来传递数据,我只能发送 char 而不能发送数组/字符串。

【问题讨论】:

  • 好的,我现在这样做了,谢谢您的建议

标签: c++ arrays file char blank-line


【解决方案1】:

我放弃了尝试将它们直接放入 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];
    }
}

【讨论】:

    【解决方案2】:

    您不需要将所有字符串都保存在内存中。一次只读一行。如果该行是回文并且比您目前看到的最长的还长,请存储它的长度和行号。然后撞行计数器。像这样的:

    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】:

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

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

      【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 2021-12-27
        • 1970-01-01
        • 2016-10-07
        相关资源
        最近更新 更多