将文本文件读入字符串数组

时间:2017-04-16 08:09:25

标签: c++ arrays string file getline

我试图将文件对象的内容读入一个字符串数组,但是当我打印数组的内容时,无论我什么也不尝试。具体来说,我想通过将文本文件传递到数组中,并在数组上使用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();
}

2 个答案:

答案 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逐行读取,也就是说,如果您的文本不包含换行符,则会读取整个文件,就好像它只是一个文件一样。