Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/04/2009, 11:40
Avatar de rodno
rodno
 
Fecha de Ingreso: enero-2009
Ubicación: En algun lugar de Cuba
Mensajes: 426
Antigüedad: 17 años, 8 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 *pInfo, size_t pSize, size_t pCount = 1);
  
void Remove();
  
void Rename(AnsiString pName);
  
void SeekFromCur(long pPositions);
  
void SeekFromEnd(long pPosition);
  
void SeekTo(long pPosition);
  
int Write(void *pInfo, size_t pSize, size_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 = fopen( aFileName.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 *pInfo, size_t pSize, size_t pCount)
{
  return 
fwrite(pInfo, pSize, pCount, fFile);
}
//---------------------------------------------------------------------------

int TFile::Read(void* pInfo, size_t pSize, size_t pCount)
{
  return 
fread(pInfo, pSize, pCount, fFile);
}
//---------------------------------------------------------------------------

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

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

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

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

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

  
fseek(fFile, 0, SEEK_END);
  
long result = ftell(fFile);

  
fseek(fFile, position, SEEK_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 argc, char* argv[])
//  Copiar un fichero texto en otro
{
  
FILE* fIn = fopen("datosin.txt", "rt");
  if (
fIn)
  {
    
FILE* fOut = fopen("DATOSOUT.txt", "wt");
    if (
fOut)
    {
      
char outCh;
      
char inCh = fgetc(fIn);
      while (!
feof(fIn))
      {
        
outCh = fputc (inCh, fOut);
        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;
  }
}