Académique Documents
Professionnel Documents
Culture Documents
Enestosarchivosse pueden almacenarcanciones,fuentesdeprogramas,basededatossimples,etc.Losarchivosdetextose caracterizanpor serplanos,esdecir,todaslasletrastienenelmismoformatoynohaypalabrassubrayadas,ennegrita,o letrasde distintotamaooancho. Unarchivobinarioesunasecuenciadebytesquetienenunacorrespondenciaunoaunoconun dispositivo externo.Asquenotendrlugarningunatraduccindecaracteres.Adems,elnmerodebytesescritos (ledos) serelmismoquelosencontradoseneldispositivoexterno.Ejemplosdeestosarchivosson Fotografas,imgenes, textoconformatos,archivosejecutables(aplicaciones),etc. Enc,unarchivoesunconceptolgicoquepuedeaplicarseamuchascosasdesdearchivosde discohasta terminalesounaimpresora.Seasociaunasecuenciaconunarchivoespecificorealizandouna operacinde apertura.Unavezqueelarchivoestabierto,lainformacinpuedeserintercambiadaentreesteyel programa. Sepuedeconseguirlaentradaylasalidadedatosaunarchivoatravsdelusodelabibliotecade funciones;CnotienepalabrasclavesquerealicenlasoperacionesdeE/S.Lasiguientetabladaun breveresumen delasfuncionesquesepuedenutilizar.SedebeincluirlalibreraSTDIO.H.Observequela mayoradelas funcionescomienzanconlaletraF,estoesunvestigiodelestndarCdeUnix. NombreFuncin fopen()Abreunarchivo.
fclose()Cierraunarchivo. fgets()Leeunacadenadeunarchivo. fputs()Escribeunacadenaenunarchivo fseek()Buscaunbyteespecificodeunarchivo. fprintf()Escribeunasalidaconformatoenelarchivo. fscanf()Leeunaentradaconformatodesdeelarchivo. feof()Devuelveciertosisellegaalfinaldelarchivo. ferror()Devuelveciertosiseproduceunerror. rewind()Colocaellocalizadordeposicindelarchivoalprincipiodelmismo. remove()Borraunarchivo. fflush()Vacaunarchivo. Elpunteroaunarchivo. ElpunteroaunarchivoeselhilocomnqueunificaelsistemadeE/Sconbuffer.Unpunteroaun archivoes unpunteroaunainformacinquedefinevariascosassobrel,incluyendoelnombre,elestadoyla posicinactual delarchivo.Enesenciaidentificaunarchivoespecificoyutilizalasecuenciaasociadaparadirigirel funcionamiento delasfuncionesdeE/Sconbuffer.UnpunteroaunarchivoesunavariabledetipopunteroaltipoFILE quese defineenSTDIO.H.Unprogramanecesitautilizarpunterosaarchivosparaleeroescribirenlos mismos.Para obtenerunavariabledeestetiposeutilizaunasecuenciacomoesta: FILE*F; Aperturadeunarchivo. Lafuncinfopen()abreunasecuenciaparaquepuedaserutilizadaylaasociaaunarchivo.Su prototipoes: FILE*fopen(constcharnombre_archivo,costcharmodo); Dondenombre_archivoesunpunteroaunacadenadecaracteresquerepresentanunnombre validodel archivoypuedeincluirunaespecificacindeldirectorio.Lacadenaalaqueapuntamododetermina comoseabreel archivo.Lasiguientetablamuestralosvalorespermitidosparamodo. ModoSignificado rAbreunarchivodetextoparalectura. wCreaunarchivodetextoparaescritura. aAbreunarchivodetextoparaaadir. rbAbreunarchivobinarioparalectura. wbCreaunarchivobinarioparaescritura. abAbreunarchivobinarioparaaadir. r+Abreunarchivodetextoparalectura/escritura.
w+Creaunarchivodetextoparalectura/escritura. a+Aadeocreaunarchivodetextoparalectura/escritura. r+bAbreunarchivobinarioparalectura/escritura. w+bCreaunarchivobinarioparalectura/escritura. a+bAadeocreaunarchivobinarioparalectura/escritura. Lafuncinfopen()devuelveunpunteroaarchivo.Unprogramanuncadebealterarelvalordeese puntero. Siseproduceunerrorcuandoseestaintentandoabrirunarchivo,fopen()devuelveunpunteronulo. Sepuedeabrirunarchivobienenmodotextoobinario.Enlamayoradelasimplementaciones, enmodo texto,lasecuenciasderetornodecarro/saltodelneaseconviertenacaracteresdesaltodelneaen lectura.Enla escritura,ocurrelocontrario:loscaracteresdesaltodelneaseconviertenensaltodelnea.Estas conversionesno ocurrenenarchivosbinarios. LamacroNULLestdefinidaenSTDIO.H.Estemtododetectocualquiererroralabrirun archivo:comopor ejemplodiscollenooprotegidocontraescrituraantesdecomenzaraescribirenl. Siseusafopen()paraabrirunarchivoparaescritura,entoncescualquierarchivoexistenteconel mismo nombreseborrarysecreaunonuevo.Sinoexisteunarchivoconelmismonombre,entoncesse crear.Sise quiereaadiralfinaldelarchivoentoncesdebeusarelmodoa.Siseusaaynoexisteelarchivo,se devolverun error.Laaperturadeunarchivoparalasoperacionesdelecturarequierequeexistaelarchivo.Sino existe,fopen() devolverunerror.Finalmente,susseabreunarchivoparalasoperacionesdeleer/escribir,la computadoranolo borrarsiexiste;sinembargo,sinoexiste,lacomputadoralocrear. Cierredeunarchivo. Lafuncinfclose()cierraunasecuenciaquefueabiertamedianteunallamadaafopen().Escribe todala informacinquetodavaseencuentreenelbuffereneldiscoyrealizauncierreformaldelarchivoa niveldelsistema operativo.Unerrorenelcierredeunasecuenciapuedegenerartodotipodeproblemas,incluyendola prdidade datos,destruccindearchivosyposibleserroresintermitentesenelprograma.Elprototipodeesta funcines: intfclose(FILE*F); DondeFeselpunteroalarchivodevueltoporlallamadaafopen().Sisedevuelveunvalorcero significa
quelaoperacindecierrehatenidoxito.Generalmente,estafuncinsolofallacuandoundiscoseha retiradoantes detiempoocuandonoquedaespaciolibreenelmismo. Paraintroduciruobtenerdatosdeunarchivotenemoslassiguientescuatrofunciones: fprintf()yfscanf() Estasfuncionessecomportanexactamentecomoprinft()yscanf()discutidasanteriormente, exceptoque operansobrearchivo.Susprototiposson: intfprintf(FILE*F,constchar*cadena_de_control,.....); intfscanf(FILE*F,constchar*cadena_de_control,.....); DondeFesunpunteroalarchivodevueltoporunallamadaafopen().fprintf()yfscanf() dirigensus operacionesdeE/SalarchivoalqueapuntaF. Lasfuncionesfgets()yfputs()puedenleeryescribircadenasaodesdelosarchivos.Los prototiposde estasfuncionesson: char*fputs(char*str,FILE*F); char*fgets(char*str,intlong,FILE*F); Lafuncinputs()escribelacadenaaunarchivoespecifico.Lafuncinfgets()leeunacadena desdeel archivoespecificadohastaqueleeuncarcterdenuevalneaolongitud1caracteres. SiseproduceunEOF(EndofFile)lafuncingetsretornaunNULL. Funcionfeof() Cuandoseabreunarchivoparaentradabinaria,sepuedeleerunvalorenteroigualdelamarca EOF.Esto podrahacerquelarutinadelecturaindicaseunacondicindefindearchivoancuandoelfinfsico delmismonose hayaalcanzado.Pararesolveresteproblema,Cincluyelafuncinfeof(),quedeterminacuandoseha alcanzadoel findelarchivoleyendodatosbinarios.Lafuncintieneelsiguienteprototipo: intfeof(FILE*F); SuprototiposeencuentraenSTDIO.H.Devuelveciertosisehaalcanzadoelfinaldelarchivo,en cualquier otrocaso,0.Porsupuesto,sepuedeaplicarestemtodoaarchivosdetextotambin. Ahorabienparaelejemploanteriorustedincluirlosdatosdelaforma: Nombredelalumno1nota Nombredelalumno2nota ..... Algunasvecesustednecesitaramanipularporseparadoelnombredelalumnoysunota,paraesto es necesariosepararloencampos.Sepuederealizarintroduciendocaracteresdelimitadoresentrecampoy
campo,por ejemplo: fprinft(C,%s;%d\n,nombre,cal); Estogeneraraunarchivodetipo: Nombredelalumno1;nota Nombredelalumno2;nota ..... Lafuncinrewind()inicializaelindicadordeposicin,alprincipiodelarchivo,indicadoporsu argumento.Su prototipoes: voidrewind(FILE*F); DondeFesunpunteroaunarchivovlido.EstafuncinseencuentraenSTDIO.H Lafuncinferror()determinasisehaproducidoenerrorenunaoperacinsobreunarchivo.Su prototipo es: intferror(FILE*F); DondeFesunpunteroaunarchivovlido.Devuelveciertosisehaproducidounerrordurantela ultima operacinsobreelarchivo.Encasocontrario,devuelvefalso.Debidoaquecadaoperacinsobreel archivo actualizalacondicindeerror,sedebellamaraferror()inmediatamentedespusdelaoperacinde estetipo;sino seaseas,elerrorpuedeperderse.EstafuncinseencuentraenSTDIO.H Lafuncinremove()borraelarchivoespecificado.Suprototipoeselsiguiente: intremove(char*nombre_archivo); Devuelvecerositienexito.Sinounvalordistintodecero. Lafuncinfflush()escribetodoslosdatosalmacenadosenelbuffersobreelarchivoasociadocon un apuntador.Suprototipoes: intfflush(FILE*F); Sisellamaestafuncinconunpunteronulosevacianlosbuffersdetodoslosarchivosabiertos. Esta funcindevuelvecerositienexito,enotrocaso,devuelveEOF.
ArgumentosdeLneadeComando
Cproveeunmecanismoparapasarargumentosdesdelalneadecomandosalprogramaquesevaa ejecutar.Cuandoelprogramacomiezasuejecucin,larutinamainesllamadacondosargumentos:un contadoryunapuntadoraunarreglodecadenasdecaracteres.Elcontadoresllamdoporconvencin argcyelapuntadorargv.Elusodedeargvesunpocotruculento.Dadoqueargvesunapundadoraun
fputs
paraversufuncionamientomostramoselsiguienteejemplo:
#include <stdio.h> int main ( int argc, char **argv ) { FILE *fp;
char cadena[] = "Mostrando el uso de fputs en un fichero.\n"; fp = fopen ( "fichero.txt", "r+" ); fputs( cadena, fp ); fclose ( fp ); } return 0;
fputs
Lafuncinfputsescribeunacadenaenunfichero.Noseaadeelcarcterderetornodelneaniel carcternulofinal.ElvalorderetornoesunnmerononegativooEOFencasodeerror.Los parmetrosdeentradasonlacadenaaescribiryunpunteroalaestructuraFILEdelficherodondese realizarlaescritura. Elprototipocorrespondientedefputses:
int fputs(const char *buffer, FILE *archivo)
paraversufuncionamientomostramoselsiguienteejemplo:
#include <stdio.h> int main ( int argc, char **argv ) { FILE *fp; char cadena[] = "Mostrando el uso de fputs en un fichero.\n"; fp = fopen ( "fichero.txt", "r+" ); fputs( cadena, fp ); fclose ( fp ); } return 0;
fgets
Estafuncinestdiseadaparaleercadenasdecaracteres.Leerhastan1caracteresohastaqueleaun retornodelnea.Enesteltimocaso,elcarcterderetornodelneatambinesledo. Elprototipocorrespondientedefgetses:
fprintf
Lafuncinfprintffuncionaigualqueprintfencuantoaparmetros,perolasalidasedirigeaun ficheroenlugardealapantalla. Elprototipocorrespondientedefprintfes:
int fprintf(FILE *archivo, const char *formato, argumento, ...);
Podemosverunejemplodesuuso,abrimoseldocumento"fichero.txt"enmodolectura/escrituray escribimosdentrodeel.
#include <stdio.h> int main ( int argc, char **argv ) { FILE *fp; char buffer[100] = "Esto es un texto dentro del fichero."; fp = fopen ( "fichero.txt", "r+" ); fprintf(fp, buffer); fprintf(fp, "%s", "\nEsto es otro texto dentro del fichero."); fclose ( fp ); } return 0;
fscanf
Lafuncinfscanffuncionaigualquescanfencuantoaparmetros,perolaentradasetomadeun ficheroenlugardelteclado. Elprototipocorrespondientedefscanfes:
int fscanf(FILE *fichero, const char *formato, argumento, ...);
Podemosverunejemplodesuuso,abrimoseldocumento"fichero.txt"enmodolecturayleyendo dentrodeel.
#include <stdio.h> int main ( int argc, char **argv ) { FILE *fp; char buffer[100]; fp = fopen ( "fichero.txt", "r" ); fscanf(fp, "%s" ,buffer); printf("%s",buffer); fclose ( fp ); return 0; }
fread
size_tfread(void*ptr,size_tsize,size_tcount,FILE*stream); Estafuncinleeunbloquedeuna"stream"dedatos.Efectalalecturadeunarreglodeelementos "count",cadaunodeloscualestieneuntamaodefinidopor"size".Luegolosguardaenelbloquede memoriaespecificadopor"ptr".Elindicadordeposicindelacadenadecaracteresavanzahastaleerla totalidaddebytes.Siestoesexitosolacantidaddebytesledoses(size*count). PARAMETROS: ptr:Punteroaunbloquedememoriaconuntamaomnimode(size*count)bytes. size:Tamaoenbytesdecadaelemento(delosquevoyaleer). count:Nmerodeelementos,loscualestienenuntamao"size". stream:PunteroaobjetosFILE,queespecificalacadenadeentrada.
fwrite
Estafuncinestpensadaparatrabajarconregistrosdelongitudconstanteyformaparejaconfread.Es capazdeescribirhaciaunficherounoovariosregistrosdelamismalongitudalmacenadosapartirde unadireccindememoriadeterminada.Elvalorderetornoeselnmeroderegistrosescritos,noel nmerodebytes.Losparmetrosson:unpunteroalazonadememoriadedondeseobtendrnlos datosaescribir,eltamaodecadaregistro,elnmeroderegistrosaescribiryunpunteroala estructuraFILEdelficheroalqueseharlaescritura. Elprototipocorrespondientedefwritees:
size_t fwrite(void *puntero, size_t tamano, size_t cantidad, FILE *archivo);
Unejemploconcretodelusodefwriteconsucontrapartefreadyusandofuncioneses:
/*
* * * * */
#include <stdio.h> void void void void menu(); CrearFichero(FILE *Fichero); InsertarDatos(FILE *Fichero); VerDatos(FILE *Fichero);
struct sRegistro { char Nombre[25]; int Edad; float Sueldo; } registro; int main(int argc, char** argv) { int opcion; int exit = 0; FILE *fichero; while (!exit) { menu(); printf("\nOpcion: "); scanf("%d", &opcion); switch(opcion) { case 1: break; case 2: break; case 3: break; case 4: exit = 1; break; default: printf("\nopcion no valida"); } } void menu() { printf("\nMenu:"); printf("\n\t1. Crear fichero"); printf("\n\t2. Insertar datos"); } InsertarDatos(fichero); VerDatos(fichero);
CrearFichero(fichero);
return 0;
void CrearFichero(FILE *Fichero) { Fichero = fopen("fichero", "r"); if(!Fichero) { Fichero = fopen("fichero", "w"); printf("\nArchivo creado!"); } else { printf("\nEl fichero ya existe!"); } fclose (Fichero); return; } void InsertarDatos(FILE *Fichero) { Fichero = fopen("fichero", "a+"); if(Fichero == NULL) { printf("\nFichero no existe! \nPor favor creelo"); return; } printf("\nDigita el nombre: "); scanf("%s", registro.Nombre); printf("\nDigita la edad: "); scanf("%d", ®istro.Edad); printf("\nDigita el sueldo: "); scanf("%f", ®istro.Sueldo); fwrite(®istro, sizeof(struct sRegistro), 1, Fichero); fclose(Fichero); return; } void VerDatos(FILE *Fichero) { int numero = 1; Fichero = fopen("fichero", "r"); if(Fichero == NULL) { printf("\nFichero no existe! \nPor favor creelo");
return; } fread(®istro, sizeof(struct sRegistro), 1, Fichero); printf("\nNumero \tNombre \tEdad \tSueldo"); while(!feof(Fichero)) { printf("\n%d \t%s \t%d \t%.2f", numero, registro.Nombre, registro.Edad, registro.Sueldo); fread(®istro, sizeof(struct sRegistro), 1, Fichero); numero++; } fclose(Fichero); } return;
[editar]