2013-01-19 97 views
0

此代码是索引文件的较大代码的一部分,并对每个文件中的单词进行标记,以便您可以在大量文件中搜索某个单词。 (如谷歌)搜索文件?

此功能应该搜索您的文件,找到您想查找的单词。但我不完全明白它是如何工作的!

有人可以请解释这段代码是做什么的,它是如何做到的?

另外,我有几个问题: 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(); 
} 
+0

嗯。其中一些问题听起来像是作业问题。但如果这是一个课堂练习,你应该寻找更好的课程。 – JoergB

+0

不,这不是功课。 – user1910524

回答

0

此功能显示相应行号通过参数的行。

1/INFILE允许打开一个文件作为在放流:http://www.cplusplus.com/reference/fstream/ifstream/

2/c_str()许可证传递给串结构以简单的char *(char数组)。它是C语言中的结构用法,它解释了方法名称为“c_str”的原因。在C++中,我们通常使用比char *多的字符串,因为它非常简单。

3 /为什么currentlineno从1开始?该功能在给定行号之前读取文件内容。再读一遍来显示想要的行。

4/++ x是预增量,x ++是后增量。 当您使用++ x时,x在使用之前递增,否则x ++会在x后递增。

int x = 1; 
cout << ++x; // display 2 
x = 1; 
cout << x++; // display 1 

5 /看运营商:http://www.cplusplus.com/doc/tutorial/operators/

+0

为什么我们要打开文件作为输入流?我们正在做的就是搜索。我们只想添加输入! – user1910524

+0

读取文件对应于程序中的一个条目。要找到相应的行,请尝试打开输入流,然后读取行,最后关闭文件。 – jbouny

+0

谢谢@bondika – user1910524

0

1)精确地 “INFILE” 什么?

ANS ::构建对象和可选的打开文件。 Link

2)内置函数c_str()做了什么?

ANS ::需要在std :: string类中获得存储 的文本的const char *表示。 Link

3)为什么变量“currentlineno”从1开始?文件的第一行不能从0开始?

ANS ::取决于函数DisplayResult的第二个输入参数。

4)++ x和x ++有什么区别?

ANS ::见this。可能你可能听说过增量和增量。

5)条件“currentlineno < lineNumber”和“currentlineno!= lineNumber”之间的区别是什么?

ANS :: currentlineno的值在条件为currentlineno < lineNumber时不应超过lineNumber的值。当条件为currentlineno != lineNumber时,currentlineno的值可能会超过或可能小于lineNumber的值,但不应等于lineNumber的值。

+0

当谈到文件时,我有点儿是初学者。所以,请不要在意我的意思时,说一个infile“Construct对象和可选的打开文件”。 你的意思是说,c_str()标记文本中的字符串? – user1910524

+0

如果您尝试使用C++进行编码,您需要进行一点阅读,例如如何构建对象以及如何构建它们。如需快速参考ifstream,请转至http://www.cplusplus.com/reference/fstream/fstream/ – Abhineet

+0

如果提供的解决方案已澄清您的疑问,您可以接受答案:-D – Abhineet

0

此功能不搜索词。

它需要输入一个文件名和一个行号。它试图找到并阅读该行。

输出开始于一个行指出:“从(fileName),线#lineNumber其结果是:” 其次是由制表缩进和随后发现线内容的文本。这第二行输出是不完整的(后面没有换行符)。

所找到的内容是空的,如果文件具有具有小于线路的请求数量,或者如果任何所请求的行之前的行的具有多于999个字符。 如果请求的行有超过999个字符,它会被截断为999个字符。

其他问题:

1)infile是自动存储持续时间和类型std::basic_ifstream<char, std::char_traits<char>>,其被用于从在fileName命名的文件读取初始化的函数作用域的对象。

2)内置于标准库字符串类中的成员函数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++库,我。e适当包括<string><iostream>标题和必要的using指令或声明。