lectura y escritura de ficheros

Iniciado por franfis, 14 Abril 2013, 16:04 PM

0 Miembros y 1 Visitante están viendo este tema.

franfis

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.

Citarcomilla: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

franfis

Si no lo explique bien por favor pregunten  >:(

Puntoinfinito

Supongo que por posiciones las entiendes como caracteres, letras.

Yo te recomiendo el siguiente uso:

Código (cpp) [Seleccionar]
char total[1026];
        ifstream archivo("archivo.txt",ios::in);
        while (!archivo.eof()) {
                archivo.getline(total,sizeof(total));
                cout << total << "\0";
        }
        return 0;


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

AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.

franfis

#3
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.

franfis

La solución era poner ;

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

después del primer for  ;D

rir3760

Cita de: franfis en 17 Abril 2013, 15:09 PM
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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

cypascal

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

Y aquí también:

#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...
Problemas interesantes de programación en C/C++ y Pascal en:
BLOG C/C++


WWW.CYPASCAL.BLOGSPOT.COM.ES