【问题标题】:Reading a text file and get the result of only the last integer per line in C/C++读取文本文件并仅获取 C/C++ 中每行最后一个整数的结果
【发布时间】:2016-03-06 04:46:18
【问题描述】:

好的,我得到了一个每行有 3 个整数的文本文件。第一个是文档编号,第二个是单词编号,第三个是该单词在该文档中出现的次数。

例如

  • 1 61 2
  • 1 76 1
  • 2 89 3
  • 3 68 2

我的课程是使用 MPI 作为在我们学校集群中的节点之间拆分文本文件的一种方式。我需要检查每个文档是否包含出现 X 次的单词,然后返回出现的文档数量。我是 C/C++ 新手,只需要知道最简单的方法是什么。

【问题讨论】:

  • 家庭作业?也许你应该尝试一些事情,然后在遇到困难时寻求帮助。
  • 我一直在使用 fscanf 读取整数,但我不确定如何仅读取每个三元组中的第一个和最后一个整数或仅读取最后一个整数
  • 能分享一下你的作品吗?
  • "I'm new to C" -- 标记为 C++,你确定你使用的是 C++,还是纯 C?
  • 我问是因为如果它是 C++ 并且你被允许使用标准库,那么你可以使用fstream operator >>。看到它也被标记为 fscanf 我想你可能只被允许使用 C 代码。

标签: c++ c mpi scanf


【解决方案1】:

只需要知道最简单的方法是什么

我认为您可以尝试以下方法:

  • 打开 txt 文件。
  • 逐行阅读。
  • 使用strtok 从每一行获取每个标记(字符串)。
  • 使用atoi 将最后一个字符串标记转换为int

作为如何提取最后一个的非常粗略的实现,请参见下面的示例:

char str[] = "3 68 2";
char *items[3] = { NULL };
char *pch;

pch = strtok(str, " ");
printf( "pch = %s\n", pch );    // first token
pch = strtok (NULL, " ");
printf( "pch = %s\n", pch );    // second token
pch = strtok (NULL, " ");
printf( "pch = %s\n", pch );    // third token

int i3 = atoi( pch );
printf( "i3 = %d\n", i3 );

【讨论】:

  • 如何只转换每行的最后一个字符串标记?
  • 您需要跳过前两个标记。 strtok 可以做到。
  • 顺便说一句,我添加了一个通过strtok提取最后一个数字的粗略实现
【解决方案2】:

您可以将此代码用作工作的基础。我不想直接解决你的作业问题。

std::ifstream file("myfile");
std::string line;
while (std::getline(file, line)) // for each line in the file, store it in variable line
{
    std::istringstream ss(line); // load the line into a string stream for processing
    int i; // variable for storing the integers
    while (ss >> i) // for each integer successfully extracted
    {
        std::cout << i << ' '; // print it out
    }
    std::cout << '\n';
}

请务必在以下情况下检查您的解决方案:

  • 空文件
  • 空行(无数字)
  • 1号上线
  • 包含非数字的行?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-08
    • 2011-06-01
    • 2010-09-14
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    相关资源
    最近更新 更多