我试图将文件对象的内容读入一个字符串数组,但是当我打印数组的内容时,无论我什么也不尝试。具体来说,我想通过将文本文件传递到数组中,并在数组上使用for循环来打印文本文件的最后十行。
void FileReader::displayLast10records(){
ifstream ifile(filename);
string myArray[26];
cout << "\n" << filename << ": LAST 10 records in file \n\n";
for (int i = 0; i < numrecords; i++)
getline(ifile, myArray[i]);
ifile.close();
if (numrecords < 10)
{
for (int i = 0; i < numrecords; i++)
cout << setw(2) << (i + 1) << ".\t" << myArray[i] << endl;
}
else if (numrecords > 10)
{
for (int i = (numrecords - 10); i < numrecords; i++)
{
cout << setw(2) << (i + 1) << ".\t" << myArray[i] << endl;
}
}
}
文件只是大块文本,包括空格。该文件看起来像:
编程语言是一种人工语言 特别是将指令传达给机器 一台电脑。编程语言可用于创建 控制机器行为和/或控制机器行为的程序 精确表达算法。 最早的编程语言早于本发明 计算机,并用于指导行为 Jacquard织机和播放器钢琴等机器。 已有数千种不同的编程语言 主要在计算机领域创建,有许多存在 每年创建。大多数编程语言描述 以命令式的方式计算,即作为序列 命令,虽然有些语言,比如那些 支持函数式编程或逻辑编程,使用 替代形式的描述。
我想将每行读入其自身的字符串数组元素。
我还有另一个成功使用getline()的函数,一次显示10行文本文件的每一行。
void FileReader::displayAllRecords(){
ifstream ifile(filename);
int displayed_lines = 0;
string arec;
cout <<"\n" << filename << ": ALL records in the file with line numbers, 10 at a time \n\n";
while (getline(ifile, arec))
{
if(displayed_lines % 10 == 0 && displayed_lines >= 1)
system("pause");
cout << setw(2) << (displayed_lines + 1) << ".\t" << arec << endl;
displayed_lines++;
}
ifile.close();
}
答案 0 :(得分:0)
您的文件可能不包含程序所需的正确行结束标记,但您的代码假定该文件只有numrecords
行结束标记。定义该变量以及如何获得该变量是另一个问题。
这里不要使用静态数组,使用std :: list,使用list::reverse_iterator
(可以从list::rbegin()
获取值,迭代10次,除非迭代器变得等于list :: rend())迭代到最后10记录,你的代码会简单得多(实际上只有几行)
答案 1 :(得分:0)
通常,您可以使用ifstream读取行:
#include <fstream>
#include <string>
#include <list>
using namespace std;
void readFile(const char* filename, list<string>& lines)
{
lines.clear();
ifstream file(filename);
string s;
while (getline(file, s))
lines.push_back(s);
}
或阅读最后10行:
void readLast10(const char* filename, list<string>& lines)
{
lines.clear();
ifstream file(filename);
string s;
while (getline(file, s))
{
lines.push_back(s);
if (line.size() > 10)
lines.pop_front();
}
}
然后你可以打印最后10行:
int main()
{
list<string> lines;
readFile(filename, lines);
int n = 0;
printf("read %d lines\n", lines.size());
for (auto const it=lines.rbegin(); it!=lines.rend() && n<10; ++it, ++n)
printf("line%2u:\t%s\n", lines.size()-n, it->c_str());
}
或者那样:
int main()
{
list<string> lines;
readLast10(filename, lines);
int n = 0;
cout << "read " << lines.size() << endl;
for (const auto& line : lines)
cout << l << endl;
}
请注意,getline逐行读取,也就是说,如果您的文本不包含换行符,则会读取整个文件,就好像它只是一个文件一样。