PDA

Ver la versión completa : [Ayuda] C++ y archivos de texto



Danielo515
31/12/2010, 02:01
Buenass. A ver los entendidos en c++ si me pueden ayudar porque yo ya quiero corrtarme las venas.

¿Alguien me puede explicar cual es la mejor forma de crear un archivo de texto con c++ con el siguiente formato?


Numero de registros
//registro1
campo1
campo2
campo3
campo4
//registro 2
campo1
campo2
campo3

Ya se que no es la mejor manera de hacerlo, pero debe ser así por capricho del enunciado.

Estoy usando fstream, para crear el archivo así
archivo << campo1<<endl;

¿Como debo luego recuperarlo?
Tened en cuenta que campo1 es un entero, campo 2 una string, camo 4 otro entero...

Ya estoy desesperado de pelearme con la implementación del fichero.
Al principio hice una función que funcionaba con el fichero previamente creado por el programa en linux. Es decir, la función compilada en windows y un fichero creado en linux, y me leia todo perfectamente con
archivo.getline(cadena_char,50)

Pero ahora, al volver a crear el archivo con el programa desde windows, todo se va a la puñetera mierda.

¿Alguna sugerencia?

Porfiii.... :rever::rever:

pakoito
31/12/2010, 02:06
C/CPP y cadenas. Buena suerte.

Danielo515
31/12/2010, 09:36
C/CPP y cadenas. Buena suerte.

Ojalá fuera eso,se trata más bien de c/c++ y archivos de texto de acceso aleatorio.

Sent from my GT-I9000 using Tapatalk

swapd0
31/12/2010, 11:35
Esto deberia funcionar, haciendolo en condiciones los campo1, campo2... deberian estar en una struct o clase y se le añadiria un metodo para volcar los valores a/desde un fichero. Ademas array deberia ser un contenedor de las STL... bla bla bla




// salida se supone que todos los registros tienen el mismo numero de campos
// numero de campos
fichero << numero << std::endl;

for ( int i=0; i<numero; ++i )
{
fichero << array[i].campo1 << std::endl;
fichero << array[i].campo2 << std::endl;
fichero << array[i].campo3 << std::endl;
}

// entrada
// numero de campos, el array deberia ser lo bastante grande
fichero >> numero;

for ( int i=0; i<numero; ++i )
{
fichero >> array[i].campo1;
fichero >> array[i].campo2;
fichero >> array[i].campo3;
}

hardyx
31/12/2010, 12:19
Aporto la definición del array como un vector de registros usando STL. Sería más fácil en C, pero tu lo has querido con C++. :D


#include <vector>
#include <string>

class TRegistro {
// usaremos cadenas de c++
int campo1;
std::string campo2;
int campo3;

// definir constructor y constructor copia
// ya que se necesitan para el vector
TRegistro() {
campo1=0; campo2=""; campo3=0;
}

TRegistro(const TRegistro &reg) {
campo1=reg.campo1;
campo2=reg.campo2;
campo3=reg.campo3;
}
};

// definimos tipo vector de registros
typedef std::vector< TRegistro > TArrayRegs;

// variable para el array
TArrayRegs array;

// reservamos 10 registros
array.resize(10);

// acceso a un campo del primer registro
array[0].campo1 = "prueba";

Danielo515
31/12/2010, 13:01
Aporto la definición del array como un vector de registros usando STL. Sería más fácil en C, pero tu lo has querido con C++. :D


#include <vector>
#include <string>

class TRegistro {
// usaremos cadenas de c++
int campo1;
std::string campo2;
int campo3;

// definir constructor y constructor copia
// ya que se necesitan para el vector
TRegistro() {
campo1=0; campo2=""; campo3=0;
}

TRegistro(const TRegistro &reg) {
campo1=reg.campo1;
campo2=reg.campo2;
campo3=reg.campo3;
}
};

// definimos tipo vector de registros
typedef std::vector< TRegistro > TArrayRegs;

// variable para el array
TArrayRegs array;

// reservamos 10 registros
array.resize(10);

// acceso a un campo del primer registro
array[0].campo1 = "prueba";



Juraría que falta algo [wei]

pakoito
31/12/2010, 13:33
¡Usar las STL es trampa!


EDIT: ****, es SACAR ese fichero. Creía que era leerlo LOL.

^MiSaTo^
31/12/2010, 13:38
¡Usar las STL es trampa!


EDIT: ****, es SACAR ese fichero. Creía que era leerlo LOL.
¿STL trampa? WTF? xD

pakoito
31/12/2010, 13:39
¿STL trampa? WTF? xD
Cosas de mi uni.

^MiSaTo^
31/12/2010, 13:41
Cosas de mi uni.

En cualquier caso se puede hacer tb con char** ... pero tb son ganas de NO usar lo que te da C++ xD

hardyx
31/12/2010, 13:45
Juraría que falta algo [wei]
Algo tendrás que poner de tu parte, que son tus deberes. :D

Sobre el fichero, Linux usa un carácter de fin de línea (CR), Windows usa dos (CR+LF). Si no te funciona con cout << endl (debería), prueba a usar cout << "\n".

swapd0
31/12/2010, 14:14
Cosas de mi uni.

Jope con las uni... ¿para que leches vas a reinventar la rueda? Yo si fuera profe de la uni intentaria dar unas clases de introducción a las STL porque son muy útiles y cuesta un poco aprenderlas desde cero.

pakoito
31/12/2010, 14:25
Jope con las uni... ¿para que leches vas a reinventar la rueda? Yo si fuera profe de la uni intentaria dar unas clases de introducción a las STL porque son muy útiles y cuesta un poco aprenderlas desde cero.
Imagínate la cara que se me quedó después de un año todo feliz (puteado) haciendo C++ y aprobando y manejando mis cadenas y listas y demás estructuras a mano cuando llego y me hablan en el foro de las STL. Voy a hablar con el profesor y me pone

http://desmotivaciones.es/demots/201011/pokerface1Peter.jpg

Danielo515
31/12/2010, 14:26
Voy a poner hoy la cagada que llevo hecha. No os creais que es el proyecto, sino unas pocas líneas de código para intentar averiguar cómo demonios meter y sacar datos del fichero, que debe contener tanto cadenas de caracteres como enteros.

Estoy que tengo el cerebro "fundio"

swapd0
31/12/2010, 15:16
El problema de mezclar enteros y cadenas es que cuando lees una cadena esta para al llegar a la marca de fin de linea o de fin de fichero, por lo que no "puedes" poner en la misma linea numeros y cadenas.

Solucion 1: pones cada campo en una linea distinta, con una linea en blanco como separación entre cada registro.

Solucion 2: pones cada registro en una linea y usas un caracter como separador entre campos (; : |), lees una linea entera y separas a mano los distintos campos.

Solucion 3: usas las boost::spririt... esto en caso de que te guste sufrir.

Danielo515
31/12/2010, 17:58
El problema de mezclar enteros y cadenas es que cuando lees una cadena esta para al llegar a la marca de fin de linea o de fin de fichero, por lo que no "puedes" poner en la misma linea numeros y cadenas.

Solucion 1: pones cada campo en una linea distinta, con una linea en blanco como separación entre cada registro.

Solucion 2: pones cada registro en una linea y usas un caracter como separador entre campos (; : |), lees una linea entera y separas a mano los distintos campos.

Solucion 3: usas las boost::spririt... esto en caso de que te guste sufrir.

La solución 1 ya la he intentaado, y de hecho es la que me gustaría llevar a cabo, pero como no se exactamente cómo funcionan las funciones por dentro, no puedo hacerlo bien, se me llena todo de errores hasta la muerte.

Aquí un prototipo que obviamente no funciona:


#include<iostream>
#include<fstream>
#include<string>
using namespace std;

void escribir_cabecera();
void escribir();
void leer();


int main(){
escribir_cabecera();
escribir();
leer();

getchar();
getchar();

}

void escribir_cabecera(){
ofstream datos;
ifstream lee;
int num=0;

lee.open("datos.txt",ios::in);
lee >> num;
lee.close();

num++;

datos.open("datos.txt", ios::in|ios::out);
datos.seekp(ios::beg);
datos<<num;


datos.close();
}

void escribir(){
ofstream datos;
string cosa;
int entero;
cout<<"Dame cadena"<<endl;
getline(cin, cosa);
cin>>entero;

datos.open("datos.txt", ios::app);
datos<<cosa<<'\n';
datos<<entero<<'\n';
datos.close();

}


void leer(){
ifstream lee;
int num=0;
string cosa;
int entero;

lee.open("datos.txt",ios::in);
lee >>num;
cout<<"Numero: "<<num<<endl;
for(int i=0; i<num; i++){
getline(lee,cosa);
lee>>entero;

cout<<"Cadena: "<<cosa<<endl;
cout<<entero<<endl;
}

lee.close();

}


El error, al menos por ahora, está al leer el archivo. ¿como debo hacerlo?

swapd0
31/12/2010, 18:15
Parece que intentas leer solo la cabecera y despues la sobre escribes, creo que con los archivos de texto te corta el fichero despues de escribir. Ten en cuenta que en modo texto si el numero es mas grande ocupa mas bytes.



void escribir(){
ofstream datos;
string cosa;
int entero;
cout<<"Dame cadena"<<endl;
// cin es la consola de entrada, lees una linea completa por ejemplo. "2 foo" y la guardas en cosa
getline(cin, cosa);
// en entero deberias tener un 2, usa el debugger
cin>>entero;

datos.open("datos.txt", ios::app);
// guardas cosa que vale "2 foo"
datos<<cosa<<'\n';
// le añades el 2
datos<<entero<<'\n';
datos.close();
// el fichero deberia tener "2 foo\n2\n"
}

}

Danielo515
31/12/2010, 18:42
Parece que intentas leer solo la cabecera y despues la sobre escribes, creo que con los archivos de texto te corta el fichero despues de escribir. Ten en cuenta que en modo texto si el numero es mas grande ocupa mas bytes.



void escribir(){
ofstream datos;
string cosa;
int entero;
cout<<"Dame cadena"<<endl;
// cin es la consola de entrada, lees una linea completa por ejemplo. "2 foo" y la guardas en cosa
getline(cin, cosa);
// en entero deberias tener un 2, usa el debugger
cin>>entero;

datos.open("datos.txt", ios::app);
// guardas cosa que vale "2 foo"
datos<<cosa<<'\n';
// le añades el 2
datos<<entero<<'\n';
datos.close();
// el fichero deberia tener "2 foo\n2\n"
}

}

Esto es surrealista, estaba buscando en google como hacer esto y me ha traido a mi propio hilo, ja ja ja.

Cuando dices que después del getline en entero debería tener un 2, ¿Por que es eso?si entero lo recojo más abajo.
En efecto, lo que quiero es abrirlo, sobreescribir la cabecera, que es el número de registros que hay, y luego leer en función de eso, pero no soy capaz. Tal como esta ese código, no me lee ninguna cadena y sí numeros raros, sin embargo si abro el archivo de texto esta todo, cada cosa en una línea, como yo esperaba.

Bueno, ya sabeis lo que pretendo. ¿Lo estoy haciendo bien?

Danielo515
31/12/2010, 22:31
Atención,e instigado a mis colegas (que en realidad el proyecto es para ellos y su universidad con la que no tengo nada que ver)para que le pregunten a su profesor,y les ha contestado que el formato del archivo lo deja a su juicio, así que sí alguno me quiere orientar por el mejor camino a tomar ke estaré muy agradecido. Se trata de guardar en un archivo 3tipos de registro de distinta longitud, dos de ellos de longitud fija y otro de longitud variable (es un cd y el nombre de todas sus pistas).
Muchas gracias a todos los que se han interesado hasta ahora y gracias a los que se van a interesar XD

Feliz año!!!

Sent from my GT-I9000 using Tapatalk

swapd0
01/01/2011, 13:35
Esto es surrealista, estaba buscando en google como hacer esto y me ha traido a mi propio hilo, ja ja ja.

Cuando dices que después del getline en entero debería tener un 2, ¿Por que es eso?si entero lo recojo más abajo.

Ups, meti la pata.



En efecto, lo que quiero es abrirlo, sobreescribir la cabecera, que es el número de registros que hay, y luego leer en función de eso, pero no soy capaz. Tal como esta ese código, no me lee ninguna cadena y sí numeros raros, sin embargo si abro el archivo de texto esta todo, cada cosa en una línea, como yo esperaba.

Bueno, ya sabeis lo que pretendo. ¿Lo estoy haciendo bien?

Nunca he hecho cosas asi con los ficheros, siempre o leia todo o escribia todo pero lo que dices en modo ascci no funciona porque al escribir un numero mayor (con mas cifras) machacaria los datos siguentes.

Lo mas facil es que leas todo el fichero en memoria, hagas las guarradas que quieras, y despues vuelques los datos a disco.

hardyx
01/01/2011, 14:43
En un fichero de texto no puedes hacer acceso aleatorio, o al menos es muy difícil, no se usa. Se suele hacer acceso secuencial, o sea leer cada registro, y si tienes que escribir escribirlo todo de nuevo, o añadir al final. El acceso aleatorio es para binarios.

Para hacer acceso aleatorio con texto, tienes que usar ficheros de C y fseek(), fread(), fwrite(), con C++ y streams no se o no lo he usado. Para los campos enteros tendrías que usar tamaño fijo, por ejemplo para enteros 12 carácteres así: 000000000123. De esa forma se pueden reescribir.

Danielo515
01/01/2011, 15:42
En un fichero de texto no puedes hacer acceso aleatorio, o al menos es muy difícil, no se usa. Se suele hacer acceso secuencial, o sea leer cada registro, y si tienes que escribir escribirlo todo de nuevo, o añadir al final. El acceso aleatorio es para binarios.

Para hacer acceso aleatorio con texto, tienes que usar ficheros de C y fseek(), fread(), fwrite(), con C++ y streams no se o no lo he usado. Para los campos enteros tendrías que usar tamaño fijo, por ejemplo para enteros 12 carácteres así: 000000000123. De esa forma se pueden reescribir.

Pues eso estaba yo pensando,que acceso aleatorio en texto no va a ser posible y la solución de volver a crear todo el archivo siempre me ha parecido un poco cutre y arriesgada. Qué me recomendais ahora que puedo elegir libremente el formato del archivo? Teniendo en cuenta que algunos registros tienen mayor longitud que otros?

Sent from my GT-I9000 using Tapatalk

swapd0
01/01/2011, 16:20
El formato binario es lo mas rapido, pero en caso de tener registros de distinta longitud se complica, ademas es mas dificil de depurar que un fichero de texto.

Eso de crear todo el fichero es normal, otra cosa es que tengas millones de registros pero en ese caso seria mejor usar una base de datos de verdad (MySQL, Postgress, sqlite...).

hardyx
01/01/2011, 17:51
Si puedes elegir formato binario, añade un campo entero o byte a cada registro (al principio) que indique el tipo de registro, luego lees un registro u otro como un bloque. Tendrías dos estructuras o clases, una para cada campo. Eso es lo más sencillo.

Danielo515
01/01/2011, 19:19
Si puedes elegir formato binario, añade un campo entero o byte a cada registro (al principio) que indique el tipo de registro, luego lees un registro u otro como un bloque. Tendrías dos estructuras o clases, una para cada campo. Eso es lo más sencillo.

Eso es justo lo que había pensado!! Muchas gracias por confirmármelo. Todos los registros tienen 9 campos en común,así que había pensado en dos estructuras, una para los campos comunes, y en función de lo leído (un campo.es el tipo de registro) leer la segunda estructura u otra vez la primera.
Porque todo esto de grabar y leer estructuras no creo que se pueda en formato texto combinando enteros strings y demás movidas.

Efectivamente si tienes muchísimos registros lo suyo es una base de datos,pero hay profesores que son idiotas y se empeñan en separar la enseñanza del mundo real.

Sent from my GT-I9000 using Tapatalk

Danielo515
01/01/2011, 19:23
Uno de los registros (se supone que esto es para una biblioteca) es un cd y habría que almacenar los nombres de las pistas, que tan pronto son 12 como que son 20, así que no se sí poner una cantidad fija o sí no como podría gestionar eso. Tal vez una lista? Y según el campo que indica el número de pistas leer tanto. Aunque esto último es muy complicado.

Sent from my GT-I9000 using Tapatalk

hardyx
01/01/2011, 22:33
No es que son idiotas los profesores, es que quieren que aprendas cómo se hace sin la ayuda de una BBDD. Además se trata de que aprendas C++, no SQL. En dispositivos portátiles y en videojuegos por ejemplo, es más eficiente y sencillo usar ficheros.

Sobre el registro que es un cd, puedes hacer varias soluciones: puede asumir que los cds no tienen más de 30 pistas y poner 30 fijas, o puedes poner otro campo que sea el número de pistas y luego los nombres (longitud variable). O puedes poner los nombres de las pistas en una campo cadena, separados por un carácter como "|".

Danielo515
01/01/2011, 23:49
No es que son idiotas los profesores, es que quieren que aprendas cómo se hace sin la ayuda de una BBDD. Además se trata de que aprendas C++, no SQL. En dispositivos portátiles y en videojuegos por ejemplo, es más eficiente y sencillo usar ficheros.

Sobre el registro que es un cd, puedes hacer varias soluciones: puede asumir que los cds no tienen más de 30 pistas y poner 30 fijas, o puedes poner otro campo que sea el número de pistas y luego los nombres (longitud variable). O puedes poner los nombres de las pistas en una campo cadena, separados por un carácter como "|".

No creo que programar un base de datos sea algo apropiado para una asignatura donde apenas acaban de empezar con c++.

El caso es que la longitud de las pistas sí la voy a poner fija. Lo que no se es como hacer una longitud variable de pistas. Por supuesto hace falta un campo que me indique el número de pistas,ahí llegamos todos. Lo que no se es como leer una cantidad variable de datos a una estructura. Debería usar un puntero? O tal vez se puede hacer algo en plan new estructura (tamaño )

Ten en cuenta que tengo que hacer una función de búsqueda y tengo que saber cuántos espacios saltarse si me toca un cd y no es el que estoy buscando.
Muchas gracias por toda la ayuda que me estas prestando.

Sent from my GT-I9000 using Tapatalk

Danielo515
03/01/2011, 06:28
¿Como puede ser que una prueba tan mierda como esta me de fallos?

La primera ejecución no me da fallos, la segunda me jode vivo.

¿Como es posible?


#include<iostream>
#include<fstream>
#include<string>
using namespace std;

struct _soporte {
long id_num;
string titulo;
//string autor;

};


void escribir();
void leer();


int main(){
escribir();
leer();

getchar();

}


void escribir(){
ofstream datos;
_soporte libro;


datos.open("datos.dat", ios::app|ios::binary);

cout<<"Titulo: "<<endl;
getline(cin, libro.titulo);

libro.id_num=99;//datos.tellp(); //la id corresponde a la posición donde empieza el registro

cout<<"Grabando: "<<libro.titulo<<" "<<libro.id_num<<endl;
datos.write(reinterpret_cast<char *> (&libro),sizeof(_soporte));

datos.close();

}


void leer(){
ifstream lee;
_soporte libro;


lee.open("datos.dat",ios::in|ios::binary);


while(!lee.eof()){

lee.read(reinterpret_cast<char *> (&libro),sizeof(_soporte));

cout<<"ID: "<<libro.id_num<<endl;
cout<<"Titulo:"<<libro.titulo<<endl;
cout<<"pos: "<<lee.tellg()<<endl;
}

lee.close();

}

swapd0
03/01/2011, 14:08
Un std::string no lo puedes guardar con el write porque internamente tiene un puntero a un buffer con la cadena (char *), ademas ten en cuenta que sizeof(_soporte) te tiene que dar (imprime el valor) unos 4 (int) + 8 (mas o menos el string).

Para guardar el string debes poner primero su tamaño (titulo.length()) y despues escribir la cadena de caracteres (titulo.c_str()).

Danielo515
03/01/2011, 14:11
Un std::string no lo puedes guardar con el write porque internamente tiene un puntero a un buffer con la cadena (char *), ademas ten en cuenta que sizeof(_soporte) te tiene que dar (imprime el valor) unos 4 (int) + 8 (mas o menos el string).

Para guardar el string debes poner primero su tamaño (titulo.length()) y despues escribir la cadena de caracteres (titulo.c_str()).

Me salvaste la vida. Vamos, que me ahorro todos esos problemas si utilizo una cadena de caracteres y tirando millas.
¿Tienen alguna ventaja las strings que justifique su uso?

Por cierto, que demonios pasa con los ficheros app, que la función que indica dónde está el puntero de lectura tellp() siempre me devuelve 0 cuando el archivo está en modo app, o que?

swapd0
03/01/2011, 15:01
Me salvaste la vida. Vamos, que me ahorro todos esos problemas si utilizo una cadena de caracteres y tirando millas.
¿Tienen alguna ventaja las strings que justifique su uso?


¿Ventajas? Un monton.



std::string a("hola");
std::string b("mundo");

std::string c=a + " " + c;


c valdra "hola mundo", haz eso con strcpy, strcat, etc...

Danielo515
03/01/2011, 16:00
¿Ventajas? Un monton.



std::string a("hola");
std::string b("mundo");

std::string c=a + " " + c;


c valdra "hola mundo", haz eso con strcpy, strcat, etc...

Ja ja ja, vale vale, para trabajar es más cómodo, pero no compensa para ciertas cosas pienso yo.

Por cierto, a ver si me sabes decir que problema hay al abrir un archivo en modo app, ya que la función tellp() siempre me devuelve el mismo valor. ¿tiene esto sentido? ¿hay alguna forma de que si un fichero no existe, lo cree y que no lo trunque? he probado con (ios::out|ios::in) pero no me lo crea.

gracias gracias:rever::rever::rever:

< - >
Vale, ya está, ahora lo tengo claro:

LA DOCUMENTACIÓN OFICIAL NO VALE NI PARA TOMAR POR CULOOOO!!!

Todo esto es una mierrrda. ¿Por que me he tenido que tirar una hora buscando por internet para dar con la solución de algo tan sencillo que el lenguaje debería tener en su documentación oficial?

¿Porqué ninguno de los modos de lectura, o escritura, o mierdas funciona como debería?

He tenido que olvidarme de los tipos de flujos de ficheros de salida, y utilizar uno genérico, ah, y ¿para que una funcion de seekp()? no funciona, tienes que utilizar seekg, pero claro, como según la documentación seekg es solo para cuando estas leyendo... pero no, es el único que funciona.

Vaya **** mierda.

Logann
03/01/2011, 18:28
Ja ja ja, vale vale, para trabajar es más cómodo, pero no compensa para ciertas cosas pienso yo.

Por cierto, a ver si me sabes decir que problema hay al abrir un archivo en modo app, ya que la función tellp() siempre me devuelve el mismo valor. ¿tiene esto sentido? ¿hay alguna forma de que si un fichero no existe, lo cree y que no lo trunque? he probado con (ios::out|ios::in) pero no me lo crea.

gracias gracias:rever::rever::rever:

< - >
Vale, ya está, ahora lo tengo claro:

LA DOCUMENTACIÓN OFICIAL NO VALE NI PARA TOMAR POR CULOOOO!!!

Todo esto es una mierrrda. ¿Por que me he tenido que tirar una hora buscando por internet para dar con la solución de algo tan sencillo que el lenguaje debería tener en su documentación oficial?

¿Porqué ninguno de los modos de lectura, o escritura, o mierdas funciona como debería?

He tenido que olvidarme de los tipos de flujos de ficheros de salida, y utilizar uno genérico, ah, y ¿para que una funcion de seekp()? no funciona, tienes que utilizar seekg, pero claro, como según la documentación seekg es solo para cuando estas leyendo... pero no, es el único que funciona.

Vaya **** mierda.

Consigue una copia de The C++ Programming Language de Bjarne Stroustrup en tu biblioteca.

La documentación oficial de C++ es ISO/IEC 14882:1998
Un poco largo para leer.

Danielo515
03/01/2011, 22:09
Consigue una copia de The C++ Programming Language de Bjarne Stroustrup en tu biblioteca.

La documentación oficial de C++ es ISO/IEC 14882:1998
Un poco largo para leer.

Te agradezco la recomendación de lectura, pero c++ lo estoy aprendiendo ahora mismo y lo hago solo para ayudar a unos colegas que no tienen ni PI ya no de c++ sino de programar en general.

De todos modos, suelo cambiar mucho de lenguaje, y si es un gran tocho no se si me compensa para las 4 cosas que vaya a hacer en c++.

¿está en inglés? ¿hay alguna traducción decente al castellano? ¿Vale con leerlo o requiere de una astucia sin igual para entender ciertas cosas?

Es decir, seguro que en ese libro viene como funciona todo lo que yo he mencionado, pero seguro que no pone lo que yo he puesto, es decir, la deducción de en que casos sí, y en que casos no. No se si me explico, vamos, que si peca de ser demasiado teórico.

hardyx
04/01/2011, 01:44
Ya te dije que lo hicieras con las funciones de ficheros de C: fopen, fread, fwrite, porque con los flujos de c++ te vas a volver loco. Y más si estás empezando.

Aqui tienes una gran referencia en español:
http://c.conclase.net/

Y aqui una referencia muy completa de c++:
http://msdn.microsoft.com/es-es/library/ty9hx077.aspx

Danielo515
09/01/2011, 11:46
Ya te dije que lo hicieras con las funciones de ficheros de C: fopen, fread, fwrite, porque con los flujos de c++ te vas a volver loco. Y más si estás empezando.

Aqui tienes una gran referencia en español:
http://c.conclase.net/

Y aqui una referencia muy completa de c++:
http://msdn.microsoft.com/es-es/library/ty9hx077.aspx

Bueno, supongo que te alegrará saber que el proyecto ya está terminado, y como consecuencia mi colega se ha chinado conmigo. Para que veas.

Al final he usado estructuras y archivos binarios. Supongo que lo sabrás, pero los streams de c++ tienen métodos equivalentes como write y read que permiten guardar bloques completos.

Precisamente en c con clase hay dos ejemplos de eso en sendos lenguajes.

La dificultad de todo esto residía en usar archivos de texto, pero al final he pasado y uso binarios.

Muchas gracias por vuestra ayuda. Al final le he puesto colores con la librería de windows, porque mi colega lo necesitaba para linux, pero al final me lo quedó para mi uso personal y que le jodan.

Voy a ver sí implemento el indizado de la base de datos.

Sent from my GT-I9000 using Tapatalk