C++程序变量未在作用域声明、类型不匹配编译错误问题求助
问题原因及解决方法
1. not declared in this scope错误解决
成因
- 标准库类型未加
std::命名空间前缀:C++所有标准库提供的类(ofstream/ifstream/ostream/string)都属于std命名空间,代码中多个位置漏加前缀,编译器无法识别对应类型,进而判定变量未声明。 - 引用了未定义的变量:代码中
infile.open(out);这行里的out变量从未定义,属于无效冗余代码。
修正方案
补全所有标准库类型的std::前缀,删除无效代码:
printOutput函数参数中的string LetterGrade改为std::string LetterGradeprintOutput函数参数中的ostream& outfile改为std::ostream& outfilemain函数中的ofstream outfile;改为std::ofstream outfile;main函数中的ifstream infile;改为std::ifstream infile;- 所有未加前缀的
cin改为std::cin - 删除
infile.open(out);这行无效代码
2. 类型不匹配警告成因及解决
成因
printOutput函数的outfile参数未加std::前缀,编译器无法识别为标准输出流类型,默认判定为int类型,此时对int变量使用流插入运算符<<,就会触发「std::basic_ostream和int类型不匹配」的报错。
修正方案
给printOutput函数的ostream参数加上std::前缀即可。
3. 其他可修正的逻辑问题
main函数末尾多了一个多余的右大括号,直接删除- 文件打开失败的判断逻辑里,
continue;后的return 0;永远无法执行,直接删除 - 嵌套for循环重复使用变量名
i,会导致外层循环计数被内层修改,将内层循环变量改为其他名称即可 - 输出文件打开操作放在了循环内部,每次处理新输入文件都会覆盖之前的输出结果,如果需要保留所有处理结果,可以把
outfile.open("Result");移到循环外,或者打开时增加std::ios::app参数开启追加写入模式
修正后完整代码
#include <iostream> #include <fstream> #include <string> void printOutput (std::string name, std::string Id, float HPfinalscore, float testFinalscore, float overallScore, std::string LetterGrade, std::ostream& outfile) { outfile << name << " " << Id << " "; /* << HPfinalscore << " " << testFinalscore << " " << overallScore << " " << LetterGrade; */ } int main() { std::ofstream outfile; std::ifstream infile; int num; std::string file_name; std::string name; std::string Id; std::string LetterGrade; float HPfinalscore = 0, testFinalscore=0, overallScore=0; std::cout<<"How many files are you processing: "; std::cin>>num; for(int i=0;i<num;i++) { int count[10]; for(int j=0;j<10;j++) count[j]=0; char c,s[1000]; std::cout<<"Please input the name of the file: "; std::cin>>file_name; infile.open(file_name.c_str()); if ( !infile) { std::cout << "Could not open input file: " << file_name << "\n"; continue; } outfile.open("Result"); if ( !outfile) { std::cout << "Could not open output file \n"; return 0; } infile >> name; while(!infile.eof()) { infile >> Id; /* HPfinalscore = getHPScores(infile); testFinalscore = getTestscores(infile); overallScore = EndingScore(HPfinalscore, testFinalscore); LetterGrade= Grade(overallScore); */ printOutput (name, Id, HPfinalscore, testFinalscore, overallScore, LetterGrade, outfile); infile >> name; } infile.close(); outfile.close(); } return 0; }
内容的提问来源于stack exchange,提问作者ChunkierLizard
相关产品推荐
相关产品推荐

