11
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>

void vowel(fstream a){
    char ch;
    int ctr = 0;
    while(!a.eof()){
        a.get(ch);
        if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U'){
            cout << ch;
            ctr++;
        }
    }
    cout << "Number of Vowels: " << ctr;
}

main(){
    fstream a;
    a.open("temp.txt", ios::in);
    vowel(a);
return 0;
}

在这个简单的程序中,我试图计算文件 temp.txt 中大写元音的数量。但是,我收到错误:

ios::ios(ios &) 在函数 fstream::fstream(fstream&) 中不可访问

而是在函数本身中打开文件来完成这项工作。为什么会这样?非常感谢

注意:

如何通过函数参数使用 fstream(特别是 ofstream)

这里它说,它应该按照我尝试的方式工作。

瑞克

4

3 回答 3

15

fstream对象不可复制。而是通过引用传递fstream&::

void vowel(fstream& a)

请注意,您可以通过向构造函数提供相同的参数来避免调用open()

fstream a("temp.txt", ios::in);

不要使用while(!a.eof()),立即检查读取操作的结果。仅当eof()尝试读取文件中的最后一个字符之后才会设置。这意味着当上一次调用从文件中读取最后一个字符时,这!a.eof()将是真的,但随后会失败并设置 eof 但代码不会注意到失败,直到它再次处理后,即使读取失败。get(ch)get(ch)ch

正确结构示例:

while (a.get(ch)) {
于 2013-01-24T14:26:30.187 回答
4

您需要fstream通过引用传递:

void vowel(fstream& a){ .... }
//                ^ here!
于 2013-01-24T14:27:06.630 回答
2

试试这个。而不是发送文件计数元音。

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int vowels=0;
void vowel(string a){
    char ch;
    int ctr = 0;
int temp=0;
    for(temp=0,temp<a.length();temp++){
        ch=a.at(temp);
        if (ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U'){
            cout << ch;
            ctr++;
        }
    }
    vowels+=ctr;
}

main(){
    fstream a;
    a.open("temp.txt", ios::in);

string temp;
while(getline(a,temp))
{
vowel(temp);
function2(temp);
function3(temp);


... so on for more then one functions.

}        
vowel(a);
    return 0;
    }

如果你想传递文件,那么使用上面的答案。(通过引用传递 fstream)。

于 2013-01-24T14:38:34.613 回答