错误:没有匹配函数来调用'getline(FILE *&,std :: string&)'

时间:2016-09-21 02:24:48

标签: c++ struct getline

错误:没有匹配函数来调用'getline(FILE *&,std :: string&)' 功能代码:

void CarregarArquivo(){
aluno alunos_auxiliar[MAX];
FILE *arquivo;
arquivo=fopen ("texto.txt","r");
int quantidade=0;
fscanf(arquivo,"%d",&quantidade);
if(quantidade!=0){
    quantusuario=quantidade;
    for(int i=0;i<quantidade;i++){
        getline(arquivo,alunos[i].nome);
        fscanf(arquivo,"%d",&alunos[i].matricula);
        printf("%d",alunos[i].matricula);
        fscanf(arquivo,"%d/%d/%d",&alunos[i].nascimento.dia,&alunos[i].nascimento.mes,&alunos[i].nascimento.ano);
        if(alunos[i].numero!=0){
            for(int j=0;j<alunos[i].numero;j++){
                getline(arquivo,alunos[i].materias[j].nome);
                fscanf(arquivo,"%.1f",&alunos[i].materias[j].nota);
            }
        }
    }
}
else if(quantidade == 0 && arquivo == NULL){
    quantusuario =0;
}
fclose(arquivo);

}

包括:

registro.h在那里有结构:

struct aluno{
string nome;
int numero;
int matricula;
data nascimento;
disciplina materias[10];

};

包括:

#include"registros.h"
#define MAX 100
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include"funcoes.h"
#include <fstream>
#include<string>

Getline请工作。

我是巴西人。我知道变量的名称。抱歉我的英文。

3 个答案:

答案 0 :(得分:1)

您正在混淆C库的FILE *函数以及使用std::istream的C ++库函数。

您需要重写代码并将FILE *的所有用法(包括fopen()等)替换为std::ifstream

std::getline的第一个参数是std::istream &,而不是FILE *

答案 1 :(得分:0)

我认为你混淆了C和C ++ API。在C ++中,这是函数:

http://www.cplusplus.com/reference/string/string/getline/

std::getline(std::istream&, std::string&)

而在C中,函数确实是

http://man7.org/linux/man-pages/man3/getline.3.html

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

选一个并坚持下去!如果选择C ++,则使用std::fstream代替FILE*,依此类推。请务必先添加std::或使用using namespace std;以避免错误。

所以它会这样开始:

std::ifstream arquivo("texto.txt");
int quantidade=0;
arquivo >> quantidade;
if(quantidade!=0){
    quantusuario=quantidade;
    for(int i=0;i<quantidade;i++){
        std::getline(arquivo,alunos[i].nome);
        arquivo >> alunos[i].matricula;

等等。请注意您已经使用std::string的方式,因此您已经做出了选择。

答案 2 :(得分:0)

现在,它们编译好了。我这样说:

void CarregarArquivo(){
//FILE *arquivo;
//arquivo=fopen ("texto.txt","r");
int quantidade=0;
ifstream arquivo("texto.txt");
char barra=' ';
arquivo >> quantidade;
if(quantidade!=0){
    quantusuario=quantidade;

    for(int i=0;i<quantidade;i++){
        getline(arquivo,alunos[i].nome);
        cout << alunos[i].nome;
        arquivo >> alunos[i].matricula;
        arquivo >> alunos[i].nascimento.dia;
        arquivo >> barra;
        arquivo >> alunos[i].nascimento.mes;
        arquivo >> barra;
        arquivo >> alunos[i].nascimento.ano;
        if(alunos[i].numero!=0){
            for(int j=0;j<alunos[i].numero;j++){
                getline(arquivo,alunos[i].materias[j].nome);
                arquivo >> alunos[i].materias[j].nota;
            }
        }
    }
}
else if(quantidade == 0 && arquivo == NULL){
    quantusuario =0;
}
arquivo.close();
}

&#34;巴拉&#34;是因为我的txt有这种格式的日期:xx / xx / xxxx.now我需要的是Getline工作正常。 :(。它还没有工作。 我的txt就是这样:

2
Thiago
12312
21/12/1995
Math
10.0
Scott
31233
12/12/1995

首先是需要阅读的人数。接下来是注册和出生日期.cout bellow getline仅用于测试,而printf nothing.iksemyonov我使用命名空间std。 编辑: 问题来自于.txt,thx guys

的形成