这段代码是索引文件的更大代码的一部分,它对每个文件中的单词进行标记化,以便您能够在大量文件中搜索某个单词。(像谷歌一样)
此函数用于在文件中搜索您想要查找的单词。但是我不完全理解它是如何工作的!
有人能解释一下这段代码是做什么的吗?它是怎么做的?
此外,我还有几个问题: 1)在"infile“中到底是什么? 2)内置函数c_str()做了什么? 3)为什么变量"currentlineno”从1开始?文件的第一行不能从0开始吗? 4) ++x和x++有什么区别? 5)条件"currentlineno < lineNumber“和"currentlineno != lineNumber”有什么区别?
代码如下:
void DisplayResult(string fileName, int lineNumber)
{
ifstream infile(fileName.c_str(), ifstream::in);
char line[1000];
int currentlineno = 1;
while(currentlineno < lineNumber)
{
infile.getline(line, 1000);
++currentlineno;
}
infile.getline(line, 1000);
cout<<endl<<"\nResult from ("<<fileName<<" ), line #"<<lineNumber<<": "<<endl;
cout<<"\t"<<line;
infile.close();
}发布于 2013-01-19 21:47:49
此函数显示相应行号处的行,并按参数传递。
1/ Infile允许像put streams中那样打开文件:http://www.cplusplus.com/reference/fstream/ifstream/
2/ c_str()允许将字符串结构传递给简单的char* (字符数组)。它是C语言中使用的结构,解释了方法名为"c_str“的原因。在C++中,我们通常更多地使用字符串而不是字符*,因为它确实更简单。
3/为什么currentlineno从1开始?该函数在给定行号之前读取文件内容。,再读一遍以显示所需的行。
4/ ++x是前增量,x++是后增量。当您使用++x时,x在使用它之前递增,否则,使用x++时,x在之后递增。
int x = 1;
cout << ++x; // display 2
x = 1;
cout << x++; // display 15/查看运算符:http://www.cplusplus.com/doc/tutorial/operators/
发布于 2013-01-19 21:42:09
1)“infile”到底是什么?
ANS::构造对象和可选的打开文件。Link
2)内置函数c_str()做什么?
获取存储在std::string类中的文本的常量char*表示是必需的。Link
3)为什么变量currentlineno从1开始?文件中的第一行不能从0开始吗?
ANS::依赖于函数DisplayResult的第二个输入参数。
4) ++x和x++的区别是什么?
ANS::参见this。你可能听说过Post-Increment和Pre-Increment。
5)条件"currentlineno < lineNumber“和"currentlineno != lineNumber”有什么区别?
当condition为currentlineno < lineNumber时,currentlineno的值不应超过lineNumber的值。当condition为currentlineno != lineNumber时,currentlineno的值可以大于或小于lineNumber的值,但不应等于lineNumber的值。
发布于 2013-01-19 22:54:50
此函数不搜索单词。
它接受文件名和行号作为输入。它试图找到并读取这行代码。
输出以一行开始:"The result from (fileName ),line #lineNumber:“后面跟着一个缩进的文本,后跟找到的行内容。这第二行输出是不完整的(后面没有换行符)。
如果文件的行数少于请求的行数,或者请求的行之前的任何行的字符数超过999个字符,则找到的内容为空。如果请求的行超过999个字符,它将被截断为999个字符。
其他问题:
1) infile是一个函数作用域对象,自动存储持续时间,类型为std::basic_ifstream<char, std::char_traits<char>>,初始化为从fileName中命名的文件中读取。
2)内置于标准库string类中的成员函数c_str()将一个指向字符串内容的指针作为一个不可修改的、以nul结尾的字符数组返回,这是C中通常用于字符串的格式(类型为const char *)。由于历史原因,基于文件的标准库流采用这种格式的文件名参数。
3)人类通常从1开始计算行号。这是用于lineNumber参数的约定。使用的算法必须与此匹配。currentlineno局部变量用于表示“要读取的下一行的编号”。因此,它必须使用1进行初始化。(考虑到变量的名称,这有点令人困惑。)将行计数器初始化为0的其他实现也是可能的--这对于大多数C++程序员来说是很自然的。
4)查看C++的任何教科书或在线参考资料。寻找“前增量”(++x)和“后增量”(x++)运算符。它们具有相同的副作用(增量x),但表达式的值不同。如果不使用结果,它们是等价的(对于基本类型)。C++程序员通常更喜欢预增量,因为对于用户定义的类型,它通常可以更有效地实现。
5)更基本的教科书问题。a < b测试小于关系,a != b测试不平等。
注意:所有答案都假设使用的类型来自标准C++库,即使用了适当的<string>和<iostream>头文件以及必要的using指令或声明。
https://stackoverflow.com/questions/14414845
复制相似问题