- 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/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!