gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:13:49 24 4
gpt4 key购买 nike

我正在尝试使用一个非常简单的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com