- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用一个非常简单的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
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/
我正在尝试将二进制数据写入文件流 out,我已将其打开为 std::ios::binary。我正在尝试使用 ostream::write 写入它。 int S = 0; int space = hto
我目前正在开发一个用于我的几个程序的委托(delegate)类。我的松散函数代码有效,但我在绑定(bind)成员函数的代码中遇到编译器错误。编译错误内容为 error: expected unqual
在编译以下代码时出现错误“字符串常量之前的预期不合格 ID” In file "Notification_Constants.h" namespace NOTIFICATION_CONSTANTS {
我在 linux 机器上工作并使用 g++ 编译 .cpp 文件。我不断收到以下错误: hillClimbing.cpp:6: error: expected unqualified-id befor
我是 C++ 新手,所以我不知道在 phidget-code 示例中这个错误是什么意思: Main.cpp:8:16: error: expected unqualified-id before nu
我目前正在编写一个 C++ 应用程序,它结合 math.h 实现振荡器。我拥有的代码应该适用于应用程序(尝试编译目标文件),但我遇到了一个编译器错误,很可能与语法/等有关;我认为这与命名空间有关。错误
我在.vbs文件中的代码出现以下错误: C:\...\Root_VBS_Script_1.vbs(19, 1) Microsoft VBScript runtime error: Invalid or
测试数据 1: "Abc.TestCase For TestCase By Abc.TestCase Using TestCase" --> 2 matches 2: "(Abc.
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 7 年前。 编辑问题以包含 desired behavior, a specific proble
我有一个包含 User 子类的应用程序。 目前,我正在尝试传递一个用于识别用户登录号的 int,但是,我在声明子类构造函数时遇到了问题。 用户.h class User { public:
我从 here 复制粘贴这段代码: #include namespace boost { namespace math { template > class poisson_distributio
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我写了一个C++程序,出现了这个错误,我找不到原因。有谁能够帮我。这个函数用于从链表中删除第i个元素,我已经尽力了,但我找不到原因。 #include #include using namespa
我刚刚创建了一个新的 Heroku 应用程序,但我无法将我的存储库(分支 staging)的子树文件夹 backend 推送到新创建的应用程序 myapp-staging(还没有分支)。 这是我推送子
以下代码返回:error: expected unqualified-id before ‘for’ 我找不到导致错误的原因。感谢您的帮助! #include using namespace std;
Closed. This question needs debugging details。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。 5年前关闭。 I
我看到过一些关于这个错误的问题,但我没有太多用 C++ 创建类的经验,所以我实际上不明白答案的含义。我还应该指出,我没有编写这段代码。 我收到标题中所述的错误,我相信它来自这个头文件,但我不知道错误的
我正在尝试制作某种模板化的 Queue 类。看起来没问题,但我在同一行中收到 2 个错误,我不知道为什么。错误出现在我试图给出析构函数定义的实现文件 .cpp 中。这是类头文件的代码: #ifndef
第 21 行和第 22 行给我这个错误,这是我注意到的。从其他有类似错误信息的情况来看,我在某处遇到了语法错误。我就是想不通是什么。这是我的 .cpp 文件: #include #include
我是初学者,尝试此链接中的最后一个 C++ 练习题:http://www.cplusplus.com/forum/articles/12974/这叫做毕业。开始编写代码后,我决定将一个类定义分离到一个
我是一名优秀的程序员,十分优秀!