C++使用char数组调用ifstream getline报无匹配函数错误咨询
错误根源
你当前的调用语句匹配到了C++标准库的全局重载函数std::getline,该接口的第二个参数仅接受std::string类型对象,不支持原生char数组传参,因此编译器抛出无匹配函数的报错。
符合作业强制要求的实现方案
作业要求必须用getline从文件读整行、存入长度为100的char数组,不需要将char数组替换为string类型,直接调用输入流类自带的成员版getline即可,该接口天生支持向原生char数组写入读取内容:
- 替换原全局getline调用:将
getline(Input, sentence);修改为Input.getline(sentence, 100);
第二个参数必须传入数组总长度100,接口会自动在读取内容末尾补充字符串结束符\0,最多读取99个有效字符,完全避免数组越界,适配你定义的char sentence[100]的长度要求;同时接口会自动剥离行尾的换行符,和预期的整行读取效果完全一致,不会残留换行符影响后续strtok分词。 - 修正原有循环的逻辑漏洞:原代码中
while(!Input.eof())的判断方式容易在文件末尾触发重复读取空内容的问题,直接把读取逻辑嵌入循环判断条件,替换为while(Input.getline(sentence, 100)),只有当文件流成功读到有效整行内容时,才会进入循环执行后续分词逻辑。 - 修正代码笔误:原代码循环末尾的
create << "." << endl;属于未定义标识符的笔误,应改为对应输出流Output << "." << endl;
两类getline的核心区别(避免后续混淆)
- 全局函数版
std::getline:语法为getline(输入流, 字符串变量),仅能向std::string类型写入内容,不支持原生char数组,这就是你当前报错的原因。 - 流成员函数版
istream::getline:语法为输入流.getline(目标字符数组, 最大读取长度),专门适配原生char数组的读取场景,完全满足作业的强制要求,不需要调整已定义的char数组类型。
修正后的核心代码
char uniqueWords[100][16] = ""; int multipleWords = 0; int theWords[100]; int totalWords = 0; char sentence[100]; char delimit[] = " /."; ifstream Input; Input.open("input.txt"); if (!Input.is_open()) { cout << "Error Opening File"; exit(EXIT_FAILURE); } ofstream Output; Output.open("output.txt", std::ios_base::app); if (!Output.is_open()) { cout << "Error Opening File"; exit(EXIT_FAILURE); } char *p; // 直接用成员getline作为循环判断条件 while(Input.getline(sentence, 100)) { p = strtok(sentence, delimit); while(p) { Output << p ; words(p, uniqueWords, theWords, multipleWords); // 作业要求的自定义函数 totalWords++; p = strtok(nullptr,delimit); } Output << "." << endl; }
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

