Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con while y eof

Estas en el tema de problema con while y eof en el foro de C/C++ en Foros del Web. Hola. Tengo un problema con un programa, concretamente con un while, que me crea un bucle infinito. El problema es que lea de un archivo ...
  #1 (permalink)  
Antiguo 14/04/2009, 07:40
boli-sp
Invitado
 
Mensajes: n/a
Puntos:
problema con while y eof

Hola. Tengo un problema con un programa, concretamente con un while, que me crea un bucle infinito.

El problema es que lea de un archivo lo siguiente:
Código:
21
Juan Rodriguez de la Serna
-1
1823
1897
9

3
Tomas Suarez Rodriguez
606432415
1983
-1
1

89
Miguel Lopez Lopez
645231498
1990
1999
0
y lo muestre por pantalla.

Código PHP:
int main(int argcchar *argv[])
{
  
ifstream archivo;
  
archivo.open("datos.txt");
  
  
char ID_char[5];
  
int ID;
  
char nombre[50];
  
char telefono[9];
  
char nacimiento_char[5];
  
int nacimiento;
  
char defuncion_char[5];
  
int defuncion;
  
char hijos_char[3];
  
int hijos;
  
char linea_blanco[1];
  
  if(
archivo.fail())
    {
      
cout<< "error" << endl;
    }
  else
    {
      while(
archivo.eof()==0//aquí está el problema:'(
       
{
      
archivo.getline(ID_char,5);
      
ID=atol(ID_char);
       
      
archivo.getline(nombre,50);
   
      
archivo.getline(telefono,9);
       
      
archivo.getline(nacimiento_char,5);
      
nacimiento=atol(nacimiento_char);
      
      
archivo.getline(defuncion_char,5);
      
defuncion=atol(defuncion_char);

      
archivo.getline(hijos_char,3);
      
hijos=atol(hijos_char);

      
archivo.getline(linea_blanco,1);

      
cout << ID << endl << nombre << endl << telefono << endl << nacimiento << endl << defuncion << endl << hijos << endl << linea_blanco;
}
      
    }

  
archivo.close();
  return 
0;

Lo que hace es mostrarme ceros continuamente :S
Alguien puede ayudarme??
  #2 (permalink)  
Antiguo 14/04/2009, 07:57
Avatar de rodno  
Fecha de Ingreso: enero-2009
Ubicación: En algun lugar de Cuba
Mensajes: 426
Antigüedad: 15 años, 3 meses
Puntos: 43
De acuerdo Respuesta: problema con while y eof

Buenas,

Prueba poniendo

while (!archivo.eof())
{
}
  #3 (permalink)  
Antiguo 14/04/2009, 08:13
boli-sp
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema con while y eof

gracias por contestar

también había provado pero hace lo mismo

alguien me puedes ayudar

Última edición por boli-sp; 14/04/2009 a las 08:27
  #4 (permalink)  
Antiguo 14/04/2009, 11:40
Avatar de rodno  
Fecha de Ingreso: enero-2009
Ubicación: En algun lugar de Cuba
Mensajes: 426
Antigüedad: 15 años, 3 meses
Puntos: 43
De acuerdo Respuesta: problema con while y eof

Te mando una implenetacion para trabajar con fiheros:

ufile.h
Código PHP:
#ifndef UFileH
#define UFileH

#include <stdio.h>
#include <time.h>
//---------------------------------------------------------------------------
/*         aMode  type

                r    Open for reading only.
                w    Create for writing. .
                a    Append; open for writing at end-of-file or create for writing if the file does not exist.
                r+    Open an existing file for update (reading and writing).
                w+    Create a new file for update (reading and writing).
                a+    Open for append; open (or create if the file does not exist) for update at the end of the file.
                b       Binary
                t       Text

*/


// File Exceptions
class EFile
{
private:
  
int aErrorCode;
  
AnsiString aErrorMsg;
public:
  
EFile()
  {
    
aErrorCode 0;
    
aErrorMsg "";
  };
  
EFile(int pErrorCode)
  {
    
aErrorCode pErrorCode;
    
aErrorMsg "";
  };
  
EFile(int pErrorCode,AnsiString pErrorMsg)
  {
    
aErrorCode pErrorCode;
    
aErrorMsg pErrorMsg;
  };
  
int ErrorCode()
  {
    return 
aErrorCode;
  };
  
AnsiString ErrorMsg()
  {
    return 
aErrorMsg;
  };
};
class 
ENoClose:EFile
{
};
class 
ECantClose:EFile
{
};
class 
ENoRemove:EFile
{
};
class 
ENoRename:EFile
{
};
class 
ENoSeek:EFile
{
};
class 
ENoOpen:EFile
{
};

class 
TFile
{
private:
  
AnsiString aFileName;
  
bool aOpen;
  
FILE *fFile;
public:
  
TFile(AnsiString pFileName);
  ~
TFile();
  
void Close();
  
bool Eof();
  
bool FileExists();
  
long FilePos();
  
long FileSize();
  
bool IsOpen()
  {
    return 
aOpen;
  }
  
void Open(const char *pMode);
  
int Read(void *pInfosize_t pSizesize_t pCount 1);
  
void Remove();
  
void Rename(AnsiString pName);
  
void SeekFromCur(long pPositions);
  
void SeekFromEnd(long pPosition);
  
void SeekTo(long pPosition);
  
int Write(void *pInfosize_t pSizesize_t pCount 1);

};
//---------------------------------------------------------------------------

#endif 
ufile.cpp

Código PHP:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "UFile.h"


//---------------------------------------------------------------------------
#pragma package(smart_init)

//---------------------------------------------------------------------------

TFile::TFile(AnsiString pFileName)
{
 
aFileName pFileName;
 
aOpen false;
}
//---------------------------------------------------------------------------

TFile::~TFile()
{
  try
  {
    
Close();
  }
  catch(...)
  {
  };

}
//---------------------------------------------------------------------------

void TFile::Open(const char *pMode)
{
 
fFile fopenaFileName.c_str(), pMode);
 if (
fFile == NULL)
   throw 
ENoOpen();
 
aOpen True;
}
//---------------------------------------------------------------------------

bool TFile::Eof()
{
 return 
feof(fFile);
}
//---------------------------------------------------------------------------

void TFile::Remove()
{
 if (!
aOpen)
 {
   if(
remove(aFileName.c_str()) != 0)
     throw 
ENoRemove();
  }
  else
    throw 
ENoClose();
}
//---------------------------------------------------------------------------

bool TFile::FileExists()
{
 return ::
FileExists(aFileName);
}
//---------------------------------------------------------------------------

void TFile::Close()
{
  if (
aOpen)
  {
   if(
fclose(fFile) == 0)
     
aOpen false;
   else
     throw 
ECantClose();
  }
}
//---------------------------------------------------------------------------

int TFile::Write(void *pInfosize_t pSizesize_t pCount)
{
  return 
fwrite(pInfopSizepCountfFile);
}
//---------------------------------------------------------------------------

int TFile::Read(voidpInfosize_t pSizesize_t pCount)
{
  return 
fread(pInfopSizepCountfFile);
}
//---------------------------------------------------------------------------

void TFile::SeekTo(long pPosition)
{
  if (
fseek(fFilepPositionSEEK_SET) != 0)
    throw 
ENoSeek();
}
//---------------------------------------------------------------------------

void TFile::SeekFromCur(long pPositions)
{
 if(
fseek(fFilepPositionsSEEK_CUR) != 0)
   throw 
ENoSeek();
}
//---------------------------------------------------------------------------

void TFile::SeekFromEnd(long pPosition)
{
 if(
fseek(fFilepPositionSEEK_END) != 0)
   throw 
ENoSeek();
}
//---------------------------------------------------------------------------

long TFile::FilePos()
{
 return 
ftell(fFile);
}
//---------------------------------------------------------------------------

long TFile::FileSize()
{
  
long position ftell(fFile);

  
fseek(fFile0SEEK_END);
  
long result ftell(fFile);

  
fseek(fFilepositionSEEK_SET);

  return 
result;
}
//---------------------------------------------------------------------------

void TFile::Rename(AnsiString pName)
{
 if (!
aOpen)
 {
  if(
rename(aFileName.c_str(),pName.c_str()) != 0)
    throw 
ENoRename();
  else
    
aFileName pName;
 }
 else
    throw 
ENoClose();
}
//--------------------------------------------------------------------------- 
Y esto son las funciones para trab con el:

Lectura y escritura de caracteres ( fgetc – fputc )
Los formatos de las instrucciones de lectura y escritura de caracteres son:

fgetc (nom_var_fich);

fgetc lee y devuelve un carácter del fichero. Cuando se llega al final del fichero o hay un error, devuelve EOF.

fputc (carácter_a_escribir, nom_var_fich);

fputc escribe el carácter carácter_a_escribir en el fichero. Devuelve el carácter escrito o EOF en caso de error.

Lectura y escritura de cadenas ( fgets – fputs )

fgets (cadena_leída, num_caracteres, nom_var_fich);

fgets lee del fichero y almacena en cadena_leída los caracteres hasta leer num_caracteres del fichero o encontrar un cambio de línea. Si lee un cambio de línea, éste es almacenado en la cadena. En cualquier caso, se coloca el carácter de fin de cadena '\0' en la posición num_caracteres de la cadena leida.

Por ejemplo:

FlLE* fStr;
char arrStr[6];
fgets (arrStr, 5, fStr);

almacena en arrStr la cadena " Buen" si se lee la línea " Buenas tardes " del fichero fStr. Si se realizan dos lecturas, en la segunda se almacena en arrStr la cadena “as ta".

fputs (cadena_a_escribir, nom_var_fich);

fputs escribe la cadena terminada en nulo (\0) cadena_a_escribir en el fichero, sin copiar en el fichero el carácter nulo. No se añade tampoco un cambio de línea.

Por ejemplo:
fputs (arrStr, fStr);

Código PHP:
Copiar un fichero texto en otro

#include <stdio.h>
#include <vcl.h>
#pragma hdrstop
//------------------------------------------------------------
#pragma argsused
int main(int argccharargv[])
//  Copiar un fichero texto en otro
{
  
FILEfIn fopen("datosin.txt""rt");
  if (
fIn)
  {
    
FILEfOut fopen("DATOSOUT.txt""wt");
    if (
fOut)
    {
      
char outCh;
      
char inCh fgetc(fIn);
      while (!
feof(fIn))
      {
        
outCh fputc (inChfOut);
        if (
outCh != inCh)
          
printf ("Error de escritura escribiendo: %hc"inCh);
        
inCh fgetc(fIn);
      }
      
fclose (fOut);
      
fclose (fIn);
      return 
0;
    }
    else
    {
      
printf ("Error en la creación del fichero copia\n" );
      
fclose(fIn);
      return 
1;
    }
  }
  else
  {
    
printf ("Error en la apertura del fichero a copiar\n" );
    return 
2;
  }

  #5 (permalink)  
Antiguo 14/04/2009, 12:45
Avatar de Claw  
Fecha de Ingreso: abril-2009
Mensajes: 299
Antigüedad: 15 años
Puntos: 9
Respuesta: problema con while y eof

Con permiso de rodno y de su aporte, creo que si en tu código sustituyes:

while (!archivo.eof())

por

while (archivo.getline(ID_char,5).eof())

Podría funcionar. Salu2
  #6 (permalink)  
Antiguo 16/04/2009, 11:08
boli-sp
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema con while y eof

muchas gracias por vuestras respuestas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:14.