我正在开发一个程序,根据用户的输入打印出字数,字符数和行数。但我不断收到这些我完全不知道的错误。我想知道是否有人可以提供帮助。 **我从以前的错误中改变了它,但仍然收到错误。对不起,我是C ++的新手。
我得到的错误是
filestat.cpp:47: error: ‘line’ was not declared in this scope
filestat.cpp: In function ‘int wc(std::string)’:
filestat.cpp:55: error: ‘line’ was not declared in this scope
filestat.cpp: In function ‘int cc(std::string)’:
filestat.cpp:67: error: ‘line’ was not declared in this scope
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int lc(string fname);
int wc(string fname);
int cc(string fname);
int main(){
string fname,line,command;
ifstream ifs;
int i;
while(true){
cout<<"---- Enter a file name : ";
if(getline(cin,line)){
if(line.length()== 4 && line.compare("exit")== 0){
cout<<"Exiting";
exit(0);
}else{
string command = line.substr(0,2);
fname= line.substr(4, line.length() -5);
if( ifs.fail()){
ifs.open(fname.c_str());
cerr<< "File not found" <<fname <<endl;
ifs.clear();
}else{
if(command.compare("lc")){
lc(fname);
}else if (command.compare("wc")){
wc(fname);
}else if(command.compare("cc")){
cc(fname);
}else
cout<<"Command unknown. ";
}
}
}
}
return 0;
}
int lc(string fname){
int count;
while(getline(fname, line)){
count++;
}
cout<<"Number of lines: "<<count ;
}
int wc(string fname){
int count;
while(getline(fname, line)){
int pos=line.find_first_of("\n\t ",0);
while(pos =! string::npos){
int length=line.length();
line = line.substr(pos+1, length - pos);
count++;
}
}
cout<< "Number of words: " <<count;
}
int cc(string fname){
int count;
while(getline(fname, line)){
count = count + line.length();
}
cout<< "Number of words: " <<count;
}
当我将line设置为全局变量时,我得到错误:
filestat.cpp:48:错误:无法将参数'1'的'std :: string'转换为'char **'为'__ssize_t getline(char **,size_t *,FILE *)'
答案 0 :(得分:1)
您声明line
的方式,它是main
函数的局部变量。您不能在其他功能中使用它(cc
,wc
等。)。
将其声明为全局变量,或将其作为参数传递给cc
,wc
和其他函数。
答案 1 :(得分:0)
由于您的错误状态,line
未在列出的“范围”(即函数)中声明。如果您希望这些函数可以访问它们,则需要使line
成为全局变量(意味着在main
之外声明)。
答案 2 :(得分:0)
您还有其他错误。首先,您需要在每个line
,wc
和lc
函数中都有一个局部变量cc
。
其次,您无法使用getline
致电fname
。它期望istream
。那么为什么不将ifs
传递给你的函数呢?
int wc( ifstream &ifs )
{
string line;
int count = 0;
while(getline(fname, line)){
int pos=line.find_first_of("\n\t ",0);
while(pos =! string::npos){
int length=line.length();
line = line.substr(pos+1, length - pos);
count++;
}
}
cout<< "Number of words: " <<count;
return count;
}
在上面,我还初始化了count
并返回它(因为你有一个int返回类型并且没有返回任何东西)。
您的其他功能也有类似的变化。
顺便说一句,您可能希望查找string::find_first_of
函数并确定是否确实需要每次都用子字符串替换line
。看看第二个参数。
答案 3 :(得分:0)
好的,除了在全局范围内声明行。你需要在有问题的函数中从filename创建一个ifstream对象。例如。
int cc(string fname){
ifstream f(fname);
int count;
while(getline(f, line)){
count = count + line.length();
}
f.close();
}
这应该做,但我建议将功能定义更改为
int cc(ifstream& f);