c++ - 另一个 “expected unqualified-id before numeric constant”错误

标签 c++ compiler-errors

我正在尝试使用一个非常简单的C/C++程序,而我在最后几个小时中都在挣扎,我找不到错误!这不是家庭作业,只是一种记住我的老C的练习。
Main.c

#include <iostream>
#include "Persona.h"
#include "BaseDeDatos.h"

using namespace std;

#define agregarPersona      1
#define eliminarPersona     2
#define imprimirListado     3
#define buscarPersona       4
#define salir               5

int main(){
    BaseDeDatos datos("Personas.txt");

    Persona piter(2000, "Andres Ledesma", "Cabrera 2000");
    datos.agregarPersona(piter);

    return 0;
}
BaseDeDatos.h
#ifndef BASEDEDATOS_H
#define BASEDEDATOS_H

#include "Persona.h"
#include <inttypes.h>
#include <vector>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define identificadorNombre     '%'
#define identificadorLegajo     '#'
#define identificadorDomicilio  '$'

class BaseDeDatos{
    public:
        BaseDeDatos(char nombreDelArchivo[]);

        void agregarPersona(Persona persona);
        bool eliminarPersona(long legajo);
        void imprimirListado();
        void buscarPersona(char nombre[]);

        ~BaseDeDatos();

    private:
        void obtenerLinea(unsigned int x, char buffer[]);
        bool existeEnArray(unsigned int data[], unsigned int tamanio, unsigned int x);

        FILE *ptrFile;
        char buffer[40];
        char nombreDelArchivo[40];

};

#endif // BASEDEDATOS_H
BaseDeDatos.c
#include "BaseDeDatos.h"

BaseDeDatos::BaseDeDatos(char nombreDelArchivo[]){
    strcpy(this->nombreDelArchivo, nombreDelArchivo);

    // Solo para pruebas
    remove(nombreDelArchivo);

    if ((ptrFile = fopen(nombreDelArchivo, "r+")) != NULL){
        std::cout << "Archivo existe" << std::endl;
    }else{
        std::cout << "Archivo no existe. Lo creamos." << std::endl;
        ptrFile = fopen(nombreDelArchivo, "w+");
    }

    char dato[41];
    char nombre[40];
    // Leo los nombres mientras no llegue al final del archivo
    while(fgets(dato, 40, ptrFile) != NULL){
        if(dato[0] == identificadorNombre){
            memcpy(nombre, &dato[1], 39);           // Copio el nombre sacando el identidicador
            std::cout << "Nombre: " << nombre << std::endl;
        }
        memset(dato, 0, strlen(dato));      // Borro el nombre para la nueva lectura
        memset(nombre, 0, strlen(nombre));
    }
}

void BaseDeDatos::agregarPersona(Persona persona){
    fseek(ptrFile, 0, SEEK_END);    // Voy al final del archivo
    fprintf(ptrFile, "%c%ld\n", identificadorLegajo, persona.obtenerLegajo());
    fprintf(ptrFile, "%c%s\n", identificadorDomicilio, persona.obtenerDomicilio());
    fprintf(ptrFile, "%c%s\n", identificadorNombre, persona.obtenerNombreCompleto());

    // Escribo al archivo
    fflush(ptrFile);
}

// Eliminamos a la persona dada tomando como identificador su legajo
bool BaseDeDatos::eliminarPersona(long legajo){
    unsigned int numeroDeLinea = 0;
    bool encontreLegajo = false;
    long legajoPersona = legajo;
    unsigned int lineasIgnoradas[3];

    rewind(ptrFile);    // Vamos al comienzo del archivo

    char dato[41];
    char legajoString[40];
    // Busco el legajo de la persona
    while(fgets(dato, 40, ptrFile) != NULL){
        if(dato[0] == identificadorLegajo){
            // Convierto el string (terminado en NULL) en un long en base 10
            memcpy(legajoString, &dato[1], 39);
            long legajo = strtoumax(legajoString, NULL, 10);

            if(legajo == legajoPersona){
                std::cout << "Legajo encontrado: " << legajo << std::endl;
                encontreLegajo = true;
                break;
            }
        }
        ++numeroDeLinea;
    }

    if(encontreLegajo == false){
        std::cout << "Legajo no encontrado" << std::endl;
        return false;
    }

    // Lineas a ignorar en el nuevo archivo
    lineasIgnoradas[0] = numeroDeLinea;
    lineasIgnoradas[1] = numeroDeLinea+1;
    lineasIgnoradas[2] = numeroDeLinea+2;

    rewind(ptrFile);
    numeroDeLinea = 0;

    // Creo un nuevo archivo con la extension .bak donde guardaremos el archivo con las lineas que deseamos eliminar
    char extension[] = {".bak"};
    char nombreNuevoArchivo[40];
    strcpy(nombreNuevoArchivo, nombreDelArchivo);
    strcat(nombreNuevoArchivo, extension);

    FILE *nuevoArchivo = fopen(nombreNuevoArchivo, "w+");
    while(fgets(dato, 40, ptrFile) != NULL){
        // Si la linea no debe ser ignorada la escribo en el nuevo archivo
        if(existeEnArray(lineasIgnoradas, 3, numeroDeLinea) == false){
            obtenerLinea(numeroDeLinea, buffer);
            std::cout << "Linea: " << buffer << std::endl;
            fputs(buffer, nuevoArchivo);
        }
        ++numeroDeLinea;
    }

    // Cerramos ambos archivos
    fclose(ptrFile);
    fclose(nuevoArchivo);

    // Eliminamos el archivo viejo
    remove(nombreDelArchivo);

    // Renombramos el archivo nuevo que creamos al por defecto
    rename(nombreNuevoArchivo, nombreDelArchivo);

    // Abrimos nuevamente el archivo
    ptrFile = fopen(nombreDelArchivo, "r+");
    return true;
}

void BaseDeDatos::imprimirListado(){

}

void BaseDeDatos::buscarPersona(char nombre[]){

}

/**
  * Verifica si en el array existe el elemento x
  * @param data array que contiene los datos a comprobar
  * @param tamanio tamaño del array pasado
  * @param x dato que se desea saber si existe en el array pasado
  */
bool BaseDeDatos::existeEnArray(unsigned int data[], unsigned int tamanio, unsigned int x){
    for(unsigned int n = 0; n < tamanio; ++n){
        if(data[n] == x) return true;
    }
    return false;
}

void BaseDeDatos::obtenerLinea(unsigned int x, char buffer[]){
    unsigned int numeroDeLinea = 0;
    int c;
    char dato[40];

    rewind(ptrFile);
    if(x == 0) {
        fgets(dato, 40, ptrFile);
        strcpy(buffer, dato);
        return;
    }
    while((c = fgetc(ptrFile)) != EOF){
        // 10 es el fin de linea LF (Line feed)
        if(c == 10){
            ++numeroDeLinea;
        }
        if(numeroDeLinea == x){
            fgets(dato, 40, ptrFile);
            strcpy(buffer, dato);
            std::cout << "Linea es: " << dato << std::endl;
            return;
        }
    }
}

BaseDeDatos::~BaseDeDatos(){
    fclose(ptrFile);
}
Persona.h
#ifndef PERSONA_H
#define PERSONA_H

class Persona{
    public:
        // Crea una clase Persona en donde tenemos que definir su legajo, nombre y domicilo
        Persona(long legajo, char nombreCompleto[], char domicilio[]);

        // Obtiene el numero de legajo de la persona
        long obtenerLegajo();

        // Obtiene el nombre de la persona
        char* obtenerNombreCompleto();

        // Obtiene el domicilio de la persona
        char* obtenerDomicilio();

        ~Persona();

    private:
        long legajo;
        char nombreCompleto[40];
        char domicilio[40];
};

#endif // PERSONA_H
Persona.c
#include "Persona.h"
#include <string.h>

Persona::Persona(long legajo, char nombreCompleto[], char domicilio[]){
    // Copio el legajo a la clase Persona
    this->legajo = legajo;

    // Copia el nombre que me pasaron, al nombre de la clase -> strcpy(destino, origen)
    strcpy(this->nombreCompleto, nombreCompleto);
    strcpy(this->domicilio, domicilio);
}

long Persona::obtenerLegajo(){
    return legajo;
}

char* Persona::obtenerNombreCompleto(){
    return nombreCompleto;
}

char* Persona::obtenerDomicilio(){
    return domicilio;
}

Persona::~Persona(){}
我使用哪种BaseDeDatos方法并不重要,我总是会遇到相同的错误:

Line 17 Error: expected unqualified-id before numeric constant

Line 17 Error: expected ';' before numeric constant


第17行是datos.agregarPersona(piter);或我从BaseDeDatos使用的任何方法。我找不到任何缺少的;,这让我发疯了,这是一个简单的程序!

最佳答案

#define agregarPersona      1

这将使用agregarPersona替换 token 1的以下所有使用。所以
datos.agregarPersona(piter);

变成
datos.1(piter);

废话

您可能只想摆脱那些宏-看起来没有什么东西在使用它们。如果确实需要这些名称的常量,请改用变量:
const int agregarPersona = 1;

但是,为了避免混淆,最好不要给它们提供与类的成员函数相同的名称。

关于c++ - 另一个 “expected unqualified-id before numeric constant”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485453/

相关文章:

memory-leaks - JNI 错误(应用程序错误): non-zero capacity for NULL pointer: 80000 in LibGDX

c++ - 添加对C++ 2011的编译器支持

c++ - 对 QComboBox 中的项目使用 Qt::UserRole 和 Qt::DisplayRole

c++ - 项目的 QTreeWidget

c++ - 使用 VC++ 编译生成的 C++ 代码

c - 在 Visual Studio 2010 中编译 C WinSock 代码时出现结构重复错误

c++ - VST2.4 SDK Instrument 一个音符结束另一个音符开始时的咔嗒声

c++ - 为什么更改这些指令的顺序会显着影响性能?

c++ - C++ 中的运算符重载 ( & -> )

compiler-errors - 引用错误: OpenLayers is not defined while using osm layer