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;
}
}