You need to enable JavaScript to run this app. C++使用char数组调用ifstream getline报无匹配函数错误咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 14:36:05