Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: franfis en 14 Abril 2013, 16:04



Título: lectura y escritura de ficheros
Publicado por: franfis en 14 Abril 2013, 16:04
Hola, mi problema es que el segundo for imprime solo espacios en blanco como si en el fichero Letras.txt hubiese solo espacios en blanco, este es el código;
Citar
#include <iostream.h>
#include <fstream.h>

int main()
{
    int c=0;
   int j=0;
   int i;
   char letra;
       fstream letras("Letras.txt", ios::in|ios::out);

         for (i=0;i<=2000;i++){
     letras.seekg(i, ios::beg);
          letra=letras.get();
      if(letra=='\"'){
      c=c+1;
      cout<<"comilla:"<<c<<" "<<"posicion :"<<i<<endl;
      }
   }


   for (i=52;i<=100;i++){
   letras.seekg(i, ios::beg);
   letra=letras.get();
   letras.seekp(0, ios::end);
   cout<<letra;
   }   

    while(!letras.eof())

    letras.close();

    return 0;
}

El primer for, si funciona señalando la posición de las comillas en el fichero Letras.txt mostrandolos en pantalla.
En el segundo for estoy tratando de imprimir en pantalla las letras desde la posición 52 hasta 100 pero lo unico que aparece en pantalla son espacios.
Aqui esta el resultado de correr todo.

Citar
comilla:1 posicion :21
comilla:2 posicion :44
comilla:3 posicion :51
comilla:4 posicion :127
comilla:5 posicion :144
comilla:6 posicion :156
comilla:7 posicion :163
comilla:8 posicion :228
comilla:9 posicion :245
comilla:10 posicion :259
comilla:11 posicion :266
comilla:12 posicion :333
comilla:13 posicion :350
comilla:14 posicion :376
comilla:15 posicion :383
comilla:16 posicion :462
                                                 Press any key to continue
\___resultado del 2do for______/
imprimió solo espacios en blanco

 :o cuando pruebo ambos for's por separado si funcionan, pero juntos no.

Graciasss


Título: Re: lectura y escritura de ficheros
Publicado por: franfis en 15 Abril 2013, 18:02
Si no lo explique bien por favor pregunten  >:(


Título: Re: lectura y escritura de ficheros
Publicado por: Puntoinfinito en 15 Abril 2013, 18:37
Supongo que por posiciones las entiendes como caracteres, letras.

Yo te recomiendo el siguiente uso:

Código
  1. char total[1026];
  2.        ifstream archivo("archivo.txt",ios::in);
  3.        while (!archivo.eof()) {
  4.                archivo.getline(total,sizeof(total));
  5.                cout << total << "\0";
  6.        }
  7.        return 0;

Que vaya leyendo linea por linea. Y luego tu ya le puedes a partir de cuando o cuales caracteres debe imprimir-guardar.



Título: Re: lectura y escritura de ficheros
Publicado por: franfis en 15 Abril 2013, 19:47
Gracias, pero el archivo que intento leer es del tipo;
xxxxxxxxxxxxxxxxxx"xccvcx"xxxxxxx"nombre1"x
xxxx"dhfdhj"xxxx"nombre2"xxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx"sdfsgtj"xx"nombre3"xxxxxxxxxxxxxx
xx"swew"xx"nombre4"xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx"sretwt"xx"nombre4"x

etc...

Lo que intento leer es; nombre1, nombre2, nombre3, nombre4, nombre5. Es por eso que primero leo la posición de las comillas y luego lo que hay entre ellos, por ejemplo

leer entre las comillas 3 y 4
leer entre las comillas 7 y 8
leer entre las comillas 11 y 12
leer entre las comillas 15 y 16 etc,etc..

por eso ¿como haria? para leer por ejemplo nombre4 teniendo como datos las posiciones de las comillas entre las que se encuentra.


Título: Re: lectura y escritura de ficheros
Publicado por: franfis en 17 Abril 2013, 15:09
La solución era poner ;

letras.close();
fstream letras2("Letras.txt", ios::in|ios::out);

después del primer for  ;D


Título: Re: lectura y escritura de ficheros
Publicado por: rir3760 en 20 Abril 2013, 17:13
La solución era poner ;

letras.close();
fstream letras2("Letras.txt", ios::in|ios::out);

después del primer for  ;D
El problema con el fragmento que publicas es tratar de leer 2001 caracteres sin importar cuantos realmente hay en el archivo. Si contiene menos la función get eventualmente falla activando la bandera de fin de archivo y eso causa que, a partir de ese punto, todas las llamadas a seekg fallen.

Por eso el segundo bucle no funciona correctamente.

Para solucionarlo se debe desactivar esa bandera. Una forma algo extrema es mediante la operación que mencionas: cerrar el archivo y abrirlo de nuevo.

Un saludo


Título: Re: lectura y escritura de ficheros
Publicado por: cypascal en 20 Abril 2013, 19:16
No se si es exactamente esto lo que quieres. El código que te dejo aquí guarda los fragmentos entrecomillados de un fichero, en un fichero de texto de salida. He hecho la prueba con el fragmento que dejaste y parece que funciona.

Te lo dejo en este blog: http://cypascal.blogspot.com.es/2013/04/lectura-palabras-entrecomilladas-en-cc.html (http://cypascal.blogspot.com.es/2013/04/lectura-palabras-entrecomilladas-en-cc.html)

Y aquí también:

Código:
#include <stdio.h>
#include <string.h>

int main(void)
{
 FILE *dat,*dat2;
 char nombre[50],c;
 
 printf("Nombre del fichero a leer: "); scanf("%s", &nombre);
 
 
 if (fopen(nombre,"r")==NULL)
  printf("\nEl fichero no existe.\n\n");
 else
    {
  dat=fopen(nombre,"r");
  dat2=fopen("salida.txt","w");
  fscanf(dat,"%c",&c);
  while (!feof(dat))
  {
   if (c=='"')
   {
                fscanf(dat,"%c",&c);      
                while ((!feof(dat))&&(c!='"'))
                {
                      /*Aquí es donde se guardan los datos entre comillas*/
                      /*En este caso imprime en fichero de texto*/
                      fprintf(dat2,"%c",c);
                      fscanf(dat,"%c",&c);
                }
                fprintf(dat2,"\n");            
            }
   fscanf(dat,"%c",&c);
  }
  fclose(dat);
 }
 return 0;
}

Salu10

Edito: No me di cuenta que lo tenías en C++, sorry...