修复行数读取函数的语法

Fixing syntax of number of line reading function

我之前尝试制作一个程序,告诉用户文本文件中的字符数、单词数和行数。我创建了函数来确定每个函数的数量,但我是按值传递它们的。这导致了一个错误,因为在读取 char 的数量后,它将位于文件的末尾,然后为其他两个输出零。现在我似乎无法重写我的函数,以便每次检查字符、单词和行时打开和关闭文件。有人看到我的错误在哪里吗?谢谢! (现在只是复制并粘贴了我的一个功能)。

int num_of_lines(ifstream file)
{
    string myfile;
    myfile = argv[1];

    ifstream l;
    l.open(myfile);

    int cnt3 = 0;
    string str;

    while(getline(file, str))cnt3++;
    l.close();

    return(cnt3);
}


int main(int argc, char **argv)
{ 
    int num_of_char(ifstream file);

    string file;
    file = argv[1];

    if(argc == 1)die("usage: mywc your_file"); 

    ifstream ifs;

    ifs.open(file);

    if(ifs.is_open())
    {
        int a, b, c;

        a = num_of_lines(ifs);

        cout <<"Lines: " << a << endl;
    }
    else
    {
        cerr <<"Could not open: " << file << endl;
        exit(1);
    }

    ifs.close();

    return(0);
}

除了知道名称并创建一个新的 ifstream 之外,没有办法 "reopen" 文件,但是您可以使用 seekg 成员函数来设置您的读取位置文件,并将其设置为 0 将使下一个读取操作从文件的开头开始。

流无法复制,因此您不能传递它"by value",但必须通过引用传递它。

int num_of_lines(ifstream &file)
{
    int count = 0;
    string str;

    while (getline(file, str)) {
        count++;
    }
    file.seekg(0);

    return count;
}

不过,对于整个问题,我同意 Mats Petersson 的观点。一次计算字符、行和单词的数量将比读取文件 3 次更有效。