在计算行C ++

时间:2018-01-28 22:28:05

标签: c++ arrays string file

我正在尝试将文件读入字符串数组。但我想这样做,好像我不知道文件的长度是多少。所以我想得到一个while循环来计算行,然后另一个循环来读取文档。

当我这样做时,它工作正常,但它假设我知道数组大小的长度。

string count_lines;//dummy string to read the line temp
string votes[11];
string ID[11];
string whole_line[11];
int i = 0;

while (getline(file, count_lines)) 
{
    whole_line[i] = count_lines;
    ID[i].assign(count_lines, 0, 4);
    votes[i].assign(count_lines, 6, 4);
    cout << count_lines << endl;
    i++;
}

但我尝试做这个变化,但它只打印空白行,其功能与我打印上面的选项相同

string count_lines;//dummy string to read the line temp
string votes[11];
string ID[11];
string whole_line[11];
int i = 0;

while (getline(file, count_lines)) 
{
    i++;
}

int k = 0;
while (getline(file, count_lines) && k < i) 
{
    whole_line[k] = count_lines;
    ID[k].assign(count_lines, 0, 4);
    votes[k].assign(count_lines, 6, 4);
    cout << count_lines << endl;
    i++;
}

我不确定我做错了什么。

2 个答案:

答案 0 :(得分:1)

每次调用std::geline(以及<<运算符和read方法)都会提升存储在流对象中的输入位置。在第一个while循环中,您读取整个文件,因此在此循环之后,输入位置指示符指向文件的末尾。 要在第二个循环中从头开始读取,必须使用ifstream::seekg方法将位置重置为0。通过这种方式,您可以重新阅读&#34;整个文件。

另一方面,正如评论中所指出的,这并不是逐行将文件读入内存的最佳方式。使用std::vector存储行并将getline读取的行附加到其中可能会更好。或者,您可以将整个文件一次读入单个缓冲区并将其拆分为行。

答案 1 :(得分:0)

如果您真的想要获取文件中的行数,那么将整个文件一次性读入缓冲区的效率要高得多,那么只需计算其中包含的换行符数。以下代码是更有效的方法之一。

#include <vector>
#include <algorithm>
#include <fstream>

int main()
{
    std::ifstream textFile("your_file.txt", std::ios::binary);
    size_t fileSize = textFile.tellg();
    textFile.seekg(0, std::ios::beg);

    std::vector<char> buffer(fileSize);
    size_t numLines(0);

    if (textFile.read(buffer.data(), fileSize))
    {
        numLines = std::count(buffer.begin(), buffer.end(), '\n');
    }
    return 0;
}