sistemas
Publicado por miguel peña (1 intervención) el 17/10/2002 20:12:05
Quisiera que me dijeran como convierto un archivo de texto a DBF y viceversa, me urge!!!!! gracias
Valora esta pregunta


0
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
struct DBFHeader {
char signature; // 0x03
char year;
char month;
char day;
int16_t numRecords;
int16_t headerSize;
int16_t recordSize;
char reserved[20];
char version;
char lastUpdate[3];
char reserved2[10];
char fieldDescriptor[32]; // Simplificado
};
void createDBF(const std::string& textFile, const std::string& dbfFile) {
std::ifstream infile(textFile);
std::ofstream outfile(dbfFile, std::ios::binary);
if (!infile.is_open() || !outfile.is_open()) {
std::cerr << "Error al abrir los archivos." << std::endl;
return;
}
// Crear el encabezado DBF
DBFHeader header;
header.signature = 0x03; // DBF
header.year = 2023; // Año actual
header.month = 3; // Mes actual
header.day = 27; // Día actual
header.numRecords = 0; // Se actualizará más tarde
header.headerSize = sizeof(DBFHeader) + 1; // Simplificado
header.recordSize = 32; // Tamaño de cada registro (simplificado)
std::memset(header.reserved, 0, sizeof(header.reserved));
header.version = 0x03; // Versión
std::memset(header.lastUpdate, 0, sizeof(header.lastUpdate));
std::memset(header.reserved2, 0, sizeof(header.reserved2));
// Escribir el encabezado en el archivo DBF
outfile.write(reinterpret_cast<char*>(&header), sizeof(DBFHeader));
std::string line;
while (std::getline(infile, line)) {
// Escribir cada línea como un registro en el archivo DBF
outfile.write(line.c_str(), line.size());
outfile.write("\0", 1); // Agregar un terminador
header.numRecords++;
}
// Actualizar el número de registros en el encabezado
outfile.seekp(1); // Volver al byte del número de registros
outfile.write(reinterpret_cast<char*>(&header.numRecords), sizeof(header.numRecords));
infile.close();
outfile.close();
}
int main() {
createDBF("input.txt", "output.dbf");
return 0;
}
#include <iostream>
#include <fstream>
#include <vector>
void readDBF(const std::string& dbfFile, const std::string& textFile) {
std::ifstream infile(dbfFile, std::ios::binary);
std::ofstream outfile(textFile);
if (!infile.is_open() || !outfile.is_open()) {
std::cerr << "Error al abrir los archivos." << std::endl;
return;
}
// Leer el encabezado DBF
char header[32];
infile.read(header, sizeof(header));
int16_t numRecords = *reinterpret_cast<int16_t*>(&header[4]);
// Leer cada registro
for (int i = 0; i < numRecords; ++i) {
char record[32]; // Tamaño de cada registro (simplificado)
infile.read(record, sizeof(record));
outfile << record << std::endl; // Escribir en el archivo de texto
}
infile.close();
outfile.close();
}
int main() {
readDBF("input.dbf", "output.txt");
return 0;
}