Ayuda con leer un fichero

[Cerrado]
Denunciar
-
 Elinv -
Hola,
este es mi programa lo que tengo que hacer es leer de un fichero una serie de cadenas de caracteres(en este caso son caritas tipo ;) :) ...para un juego de parejas que tengo hecho pero con numeros)

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
typedef char TCadena[50];

struct TNodo
{
TCadena icono;
TNodo *sig;
};

typedef TNodo *TLista;

TLista s;

s = new TNodo;

TCadena i, r;

const char nombre_fichero[] = "mf.txt";
ifstream mf;
mf.open(nombre_fichero);

if (mf.bad() || mf.fail())
{
cout << endl << "Incapaz de abrir el fichero "<<endl;
}
else
{
mf >> i ;
strcpy(s->icono, i);

cout<<"Ficha"<<s->icono<<endl;
s=s->sig;
while (!mf.eof())
{
cout<<"cucu"<<endl;
mf >> r;
strcpy(s->icono, r);
cout<<"Ficha"<<s->icono<<endl;
s=s->sig;
}
}
mf.close();

system("PAUSE");
}

este es mi programa y el primer caracter guardado en s me lo muestra y entra en el bucle(el cucu era para saber si entraba o no jaja) pero hay peta el programa y no se porque por favor ayudaaa

3 respuestas

Aquí te dejo otra respuesta un poco mas elaborada.
No solamente podes cargar el contenido del archivo de texto en una estructura, sino que te analiza el archivo de texto, determina el tamaño de la estructura a crear, y carga la misma con todos los símbolos, caritas ascii, o palabras, e inclusive podes utilizas los separadores que vos creas convenientes.
-------------------------------------------------------------------------------------------
Posteriormente podes ubicar el elemento de la estructura que vos quieras.
-------------------------------------------------------------------------------------------

Bueno aquí te dejo el código.

-------------------------------------------------------------------------------------------

#include <stdio.h>
#include<iostream>

using namespace std;
int main(int argc, char *argv[])
{
//declaramos variable y leemos el archivo de texto mf.txt
FILE * pFile;
char s1[100];
char s11[100];
pFile = fopen ("mf.txt" , "r");
//Si no se encuentra el archivo, se informa el error
//se hace una pausa para mostrar este evento
//se sale del programa.
if (pFile == NULL){
cout << "Error al abrir el archivo, no se encuentra el mismo." << '\n';
system("PAUSE");
return 0;
//se carga la variable -s1- con el contenido del archivo
} else {
fgets (s1 , 100 , pFile);
fclose (pFile);
}
//se muestra el contenido del archivo
cout << s1 << '\n';
//con esta función se copia el contenido de -s1- a -s11-
strncpy(s11, s1, 100);

char s2[4] = " \n\t";
char *ptr;
int x=0;
int y=0;
char *t1;
// bucle para contar mediante la función strtok
//la cantidad de palabras o símbolos en este caso, cuyo separador sea un espacio
//incrementa cada vez -y-
for ( t1 = strtok(s1," "); t1 != NULL; t1 = strtok(NULL, " ") )
{
y++;
}
//creación de una estructura para guardar cada palabra
//deben recordar que c trabaja con array de letras, con lo cual
//con lo cual definir una estructura es lo mas conveniente para estos casos.
//se define la estructura y su tamaño que lo indica el valor de -y-
//previamente definido en el bucle anterior.
struct {
char palabra[20];
}palabras[y];
//mostramos en pantalla la cantidad de palabras en el archivo
cout << y << " son las palabras detectadas.\n------------------------------\n" ;
//la función strtok es de un funcionamiento particular
//pues destruye la cadena original.
//entonces por ello copiamos arriba -s1- en -s11-
//pues -s1- sirvió para definir el total de los elementos de la estructura
//y -s11- servirá para el contenido de cada elemento de la misma.
//apuntamos strtok
ptr = strtok( s11, s2 );
//copiamos al primer elemento de la estructura -x está en valor 0
strncpy(palabras[x].palabra, ptr, 20);
//aumentamos el valor de x
x++;
while((ptr = strtok( NULL, s2 )) != NULL ){
//seguimos con strtok copiando hasta el final
strncpy(palabras[x].palabra, ptr, 20);
//aumentamos en cada vuelta el valor de x
x++;
}
//En este bucle mostramos la estructura completa como ha quedado formada.
for (int i = 0 ; i < y ; i++)
{
cout << palabras[i].palabra << "\t ---->Es la numero: " << i+1 << "\n" ;
}
//especie de menu que permite mientras x no sea igualo a 0
//mostrar uno a uno todos los componentes de la estructura.
while (x != 0)
{
//Informa que debe ingresar el número de la lista o estructura que desea ver
cout << '\n' << "Ingrese el numero de palabra enlistada que desea volver a ver." << '\n' << '\n';
cin >> x;
//esto es muy importante dado que si ingresa alguna letra por error
//deja la variable x a 0 y de esta manera no se observan estos bucles
//infinitos donde se cuelga el programa.
if(cin.fail()) {
cin.clear();
x = 0;
}
//si el número ingresado es mayor a la cantidad de elementos de la estructura
//informa este hecho y pone x igual a 1
if(x>y) {
cout << '\n' << "No existe esta cantidad de elementos en la lista.";
cout << '\n' << "La cantidad de elementos son: " << y;
cout << '\n' << "Se mostrara el primero." << '\n' << '\n';
x=1;
}
//mientras x no se igual a 0, muestra el elemento determinado de la estructura
//porque x-1?. Recuerde que este tipo de datos inicia siempre en 0(cero)
if(x!=0) {
cout << "\n" << palabras[x-1].palabra << "\t ---->Es la numero: " << x << "\n" ;
}
}
//finalmente se se presionó 0 o si se apretó alguna letra por efecto de cin.fail x quedo igual a 0
//entonces se avisa que el programa se cerrará.
cout << '\n' << "Usted saldra del programa seguidamente..." << '\n' << '\n';
//pausa para mostrar el mensaje.
system("PAUSE");
//y chau...
return 0;
}
//Código aportado por Luis Pedro Méndez.
//desde Bragado, Provincia de Buenos Aires.
//República Argentina.
//----------------------------------------
//funciona con cualquier tipo de elementos y separadores
//solo habrá que adecuar las variables s1 y s11 en su tamaño
//al tamaño de su archivo de texto.
//----------------------------------------
//Un fuerte abrazo.
1
Gracias

Unas palabras de agradecimiento nunca están de más. Deja tu comentario

CCM 12872 usuarios nos han dicho gracias este mes

Hola Amigo, como estas?

Mi nombre es Matias y soy de Argentina.

No tengo problemas en ayudarte, si quieres puedes agregarme a tu lista de contacto de messenger o escribirme un correo con PROYECTOSISTEMAS07@HOTMAIL.COM, te puedo ayudar con eso o algun programa completo.

Saludos
Hola mirá esto lo hice recien para vos:
------------------------------------------------------------------
En el archivo de texto mf.txt coloca lo siguiente:
-------------------------------------------------------
:| :P :9 :-) :¦ :þ :ð ¦) :-) ;) :) :þ) ¦-]
-------------------------------------------------------
Las caritas separalas con un espacio que será lo que le permitirá el seudo split que en "C" es "strtok"

-------------------------------------------------------
Una vez realizado el archivo de texto, colocá el siguiente código
-------------------------------------------------------
#include <stdio.h>
#include<iostream>
int main()
{
FILE * pFile;
char mystring [100];
pFile = fopen ("mf.txt" , "r");
if (pFile == NULL) perror ("Error al abrir el archivo");
else {
fgets (mystring , 100 , pFile);
/*puts (mystring);*/
fclose (pFile);
}
char * pch;
printf ("Un Split para C++ del archivo de texto que contiene: \"%s\"\n Por Luis Pedro Mendez.:\n\n",mystring);
pch = strtok (mystring," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ");
}
system("PAUSE");
return 0;
}
-------------------------------------------------------
Y listo.

Un abrazo. desde Bragado, Buenos Aires, Argentina.

Luis