从一个段落到另一个段落,从一行到另一行阅读单词(C++)
Read words from paragraph to paragraph, from line to line (C++)
我正在寻找一种从文件中读取和定位单词(行号、段落号(的方法。
例如,我想跟踪文件中单词"您"的编号。每次在一行上找到这个词,我都会把行号和段号推到两个向量上
ifstream file;
file.open(input.txt)
vector<int> paragraph_number;
vector<int> line_number;
逐段逐行阅读的最佳方法是什么?谢谢!
行号相当简单,因为您只需使用getline
或类似的东西一次读取一行。只需跟踪您从文件中读取一行的次数即可。或者,您可以计算您运行的换行符(n
(的数量。
有点棘手,没有标准化的方法来查看文件中的段落。您可能需要为段落末尾使用某种字符分隔符。您可以将两个换行符解释为一个新段落,但这部分取决于您。
假设
-
段落至少由一个空行分隔,因此一行仅包含换行
符 即使只有空格的行也不是空行,但这没有真正的意义,我让你改变它;-(
程序记住单词出现的段落行和列的编号,所有这些数字都以 1 开头,行号是全局的,而不是段落中的行排名
单词仅包含字母数字字符,因此所有其他字符都被视为分隔符。这允许在"这是不可能的"中找到单词"isn"或"t",即使它们没有与其他单词被空格隔开,或者在"jean-luc"中找到"jean"等
程序不检查输入的单词是否为有效单词
提案 :
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
int main(int argc, char ** argv)
{
if (argc != 3)
std::cerr << "Usage: " << *argv << " <file path> <word>" << std::endl;
else {
std::ifstream f(argv[1]);
if (! f.is_open())
std::cerr << "Cannot open '" << argv[1] << ''' << std::endl;
else {
std::string word = argv[2];
std::string line;
size_t line_num = 0;
size_t paragraph_num = 0;
std::vector<size_t> paragraph_number;
std::vector<size_t> line_number;
std::vector<size_t> column_number;
bool afterEmptyLine = true;
while (std::getline(f, line)) {
line_num += 1;
if (!line.empty()) {
if (afterEmptyLine) {
afterEmptyLine = false;
paragraph_num += 1;
}
std::size_t p = 0;
while ((p = line.find(word, p)) != std::string::npos) {
// check it is not a subword, suppose a word is only alphanum
if (((p == 0) || !isalnum(line[p - 1])) &&
((line.length() == (p + word.length())) || !isalnum(line[p + word.length()]))) {
paragraph_number.push_back(paragraph_num);
line_number.push_back(line_num);
column_number.push_back(p + 1);
}
p += word.length();
}
}
else
afterEmptyLine = true;
}
/* debug */
std::cout << ''' << word << "' found " << paragraph_number.size() << " times :" << std::endl;
for (size_t i = 0; i != paragraph_number.size(); ++i)
std::cout << "t paragraph " << paragraph_number[i]
<< " line " << line_number[i]
<< " column " << column_number[i] << std::endl;
}
}
return 0;
}
编译和执行:
bruno@bruno-XPS-8300:/tmp$ g++ -pedantic -Wextra -Wall c.cc
bruno@bruno-XPS-8300:/tmp$ cat fw
is it you or not you?
this is your decision and you are right
you and me
you
bruno@bruno-XPS-8300:/tmp$ ./a.out
Usage: ./a.out <file path> <word>
bruno@bruno-XPS-8300:/tmp$ ./a.out fw you
'you' found 5 times :
paragraph 1 line 1 column 7
paragraph 1 line 1 column 18
paragraph 1 line 2 column 27
paragraph 2 line 4 column 1
paragraph 3 line 8 column 1
bruno@bruno-XPS-8300:/tmp$
(在文件中,空行实际上是空的(
尝试这样的事情:
ifstream file("input.txt");
vector<int> paragraph_number;
vector<int> line_number;
string line, word;
int curr_paragraph_num = 0;
int curr_line_num = 0;
bool in_paragraph = false;
while (getline(file, line))
{
++curr_line_num;
if (line.empty())
{
in_paragraph = false;
}
else
{
if (!in_paragraph)
{
in_paragraph = true;
++curr_paragraph_num;
}
istringstream iss(line);
while (iss >> word)
{
if (word == "you")
{
paragraph_number.push_back(curr_paragraph_num);
line_number.push_back(curr_line_num);
}
}
}
}
相关文章:
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 从C++dll访问C#中的一行主要参数
- 在C++中,我如何接受不同于同一行的用户输入
- 如何从一行中读取特定数量的字符?(C++)
- 读取最后一行代码算法 - c++ 时出现问题
- 查找矩阵C++中每一列和每一行的最小和最大元素
- 有没有办法在一行中填充矢量图
- 需要将一行代码从C++ Qt翻译成PyQt
- 为什么如果我添加这一行,我的程序会不断询问值
- 如何使代码打印文本文件中的第一行?
- 如何在C++中以这种方式返回一行文本?
- 如何使用运算符在同一行中多次调用函数
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 而(!inputfile.eof())只读取第一行?
- 这段代码的最后一行在做什么?
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- C++找出覆盖同一行的数组
- 从一个段落到另一个段落,从一行到另一行阅读单词(C++)