Programación General > C/C++
Como guardo en archivo de texto
nicksynm:
Listo ya resolví este tema,
Además de la funcion consultas yo cree otro par de funciones alergias y vacunaciones, las cuales todas hacen los mismo. Pero me piden que después imprima todo el historial clínico del animal, es decir, que ingreso el id del animal verifico si es correcto entonces veo si tiene archivos e imprimo todos los archivos de consultas, vacunación, y alergias del animal.
el formato de los nombres de mis archivos es este idCfechahora, la letra "c" es por consulta la "v" por vacunacion y la "a" por alergias va variando. Yo supongo que si realizo un archivo=fopen("idc*","rt") debería en teoría abrir todos los archivos de consulta no?, pero la verdad que no se como leer los archivos ni como concatenarlos.
tengo entendido que puedo usar la funcion "cat" de bach para concatenar, pero no se como aplicarla.
Saludos
Edito: aca pego el codigo de mi programa completo, aunque no es realmente necesario.
--- Código: C ---Sistema centralizado de historia clínica de animales /* *************** A R C H I V O S D E C A B E C E R A ************* */#include <stdio.h>#include <conio.h>#include <string.h>#include <stdlib.h>#include <time.h> /* ******* D E C L A R A C I O N E S ******* */#pragma warning (disable:4996)#pragma warning (disable:4101)#define ruta " "#define LARCHFOTO 60 /* Path/nombre archivo foto */#define LESP 50 /* Especie */#define LRAZA 50 #define MIX 100#define MAX 500#define CANT 100 /* ******* D E C L A R A C I O N E S M E N U******* */ #define ALTA 1#define MODIF 2#define CONSULTA 3#define VACUNAS 4#define ALERGIAS 5#define HISTORIAL 6#define FOTO 7#define SALIR 8#define ESPECIE 9#define RAZA 10#define FECH 11#define SEXO 12#define PATHFOTO 13#define SALIRMOD 14 /* *** D E C L A R A C I O N E S D E T I P O S D E D A T O S *** */ typedef struct { int identificador; /* 4 dígitos*/ char especie[LESP]; char raza [LRAZA]; struct { int aa, mm, dd; } fechaNac; char sexo; char archFoto [LARCHFOTO]; } sanimal; typedef struct n { sanimal animal; struct n *sig; }nodo, *pNodo; typedef struct { char motivo[MIX]; char diagnostico[MAX]; char tratamiento[MAX]; char veterinario[MIX]; struct{ int aa, mm, dd; }fechacontrol; }sconsulta; typedef struct { char vacuna[MIX]; char plansatinario[MIX]; char planaplicacion[MIX]; struct{ int aa, mm, dd; }fechavenc; char observaciones[MAX]; }svacuna; typedef struct { struct{ int aa, mm, dd; }fecha; char alergia [MIX]; char trata[MAX]; /*tratamiento*/ char observ [MAX]; /*observaciones*/ }salergia; /*la identificacion de consulta, vacunas y alergias, es la misma si hablamos del mismo animal, creo que es asi*//* ******** D E C L A R A C I O N E S D E F U N C I O N E S ******* */ int menu(void);void cargarlista(pNodo *cabeza);void alta(pNodo *cabeza); int menumod (void); void modificar(pNodo *cabeza);void infconsultas(pNodo cabeza);void infalergias(pNodo cabeza); void infvacunacion(pNodo cabeza);void hiscomp(pNodo cabeza);void fotoanimal(pNodo cabeza);void guardararchivo(pNodo *cabeza); /* ********* M A I N ******** */int main (){ pNodo cabeza; int opc=0; int idanimal=0; cabeza=NULL; printf("Bienvenido al sistema de gestion de clinicas veterinariasnna"); while((opc=menu())!=SALIR) { switch(opc) { case ALTA: alta(&cabeza); break; case MODIF: modificar(&cabeza); break; case CONSULTA: infconsultas(cabeza); break; case VACUNAS: infvacunacion(cabeza); break; case ALERGIAS: infalergias(cabeza); break; case HISTORIAL: hiscomp(cabeza); break; case FOTO: fotoanimal(cabeza); break; } }; guardararchivo(&cabeza); return 0;} /* ********* D E F I N I C I O N E S D E F U N C I O N E S ******** */ int menu (void){ int opc, rc; do{ printf("Ingrese la opcion deseadann"); printf("1- Alta animaln"); printf("2- Modificar Animaln"); printf("3- Agregar consultan"); printf("4- Agregar infomacion vacunasn"); printf("5- Agregar informacion alergiasn"); printf("6- Mostrar historial animaln"); printf("7- Ver foto animaln"); printf("8- SalirnnOpcion:n"); rc=scanf("%d",&opc); printf("a"); fgetc(stdin); }while(rc!=1 || opc<ALTA || opc>SALIR); return opc; scanf("%d",&opc); return opc;}/*COMPLETA*/void cargarlista(pNodo *cabeza){ pNodo nuevo; FILE *animales; char aux[100]; char aux2[100]; strcpy(aux,ruta); strcpy(aux2,"veterinaria.dat"); strcat(aux,aux2); printf("%s",aux2); animales=fopen("aux","rb"); if(animales==NULL) { printf("Se crea archivo nuevo"); animales=fopen("veterinaria.dat","wb"); return; } while(!feof(animales)) { nuevo= malloc(sizeof(nodo)); fwrite(&nuevo,sizeof(nodo),1,animales); *cabeza=nuevo; nuevo->sig=NULL; fwrite(&nuevo,sizeof(nodo),1,animales); } fclose(animales);}/*completo*/ void alta(pNodo *cabeza){ pNodo anterior; pNodo actual; pNodo nuevo; pNodo indice; indice=*cabeza; if(*cabeza==NULL) { nuevo=malloc(sizeof(nodo)); *cabeza=nuevo; nuevo->sig=NULL; nuevo->animal.identificador=1000; } else { nuevo=malloc(sizeof(nodo)); anterior=NULL; actual=*cabeza; while(actual!=NULL) { anterior=actual; actual=actual->sig; } anterior->sig=nuevo; nuevo->sig=NULL; }printf("Ingrese datos del animaln");printf("Ingrese especie:");gets(nuevo->animal.especie);printf("Ingrese raza:");gets(nuevo->animal.raza);printf("Ingrese fecha de nacimiento:n"); printf("Dia:");scanf("%d",&nuevo->animal.fechaNac.dd);while(nuevo->animal.fechaNac.dd > 31 || nuevo->animal.fechaNac.dd < 1){ printf("Dia:"); scanf("%d",&nuevo->animal.fechaNac.dd);}printf("Mes:");scanf("%d",&nuevo->animal.fechaNac.mm);while(nuevo->animal.fechaNac.mm > 12 || nuevo->animal.fechaNac.mm < 1){ printf("Mes:"); scanf("%d",&nuevo->animal.fechaNac.mm);}printf("Anio:");scanf("%d",&nuevo->animal.fechaNac.aa);while(nuevo->animal.fechaNac.aa > 3000 || nuevo->animal.fechaNac.aa < 1900){ printf("Anio:"); scanf("%d",&nuevo->animal.fechaNac.aa); }fflush(stdin); /*fflush cuando paso de entero a caracter para quitar el enter*/printf("Ingrese sexo: (M o F)");scanf("%c",&nuevo->animal.sexo); /*Nota: S cadena C caracter y lleva apersan)*/printf("Ingrese ruta de la foto: (Ej: C://animal.jpg)");scanf("%s",nuevo->animal.archFoto);if(nuevo->animal.identificador==1000){}else{ while(nuevo->animal.identificador!=1000){ indice=indice->sig; if(indice->sig==NULL){ nuevo->animal.identificador=indice->animal.identificador+1; } }}}/*revisar*/int menumod (void){ int opc, rc; opc=0; do{ printf("Ingrese la opcion deseadann"); printf("9- Modificar especien"); printf("10- Modificar razan"); printf("11- Modificar fecha de nacimientosn"); printf("12- Modificar sexon"); printf("13- Modificar path de la foton"); printf("14- Salir de modificarn"); rc=scanf("%d",&opc); printf("a"); fgetc(stdin); }while(rc!=1 || opc<RAZA || opc>SALIRMOD); return opc; scanf("%d",&opc); return opc;}/*completa*/ void modificar(pNodo *cabeza){ pNodo aux; int id=0, opc=0; scanf("%d",&id); aux=*cabeza; printf("Ingrese el id del animal a modificarn"); scanf("%d",&id); while(aux!=NULL){ if(aux->animal.identificador==id){ while((opc=menumod())!=SALIRMOD) { switch(opc) { case ESPECIE: printf("Ingrese nueva especien"); scanf("%s",aux->animal.especie); break; case RAZA: printf("Ingrese nueva razan"); scanf("%s",aux->animal.raza); break; case FECH: printf("Ingrese nueva fecha de nacimienton"); printf("Dia:"); scanf("%d",&aux->animal.fechaNac.dd); while(aux->animal.fechaNac.dd > 31 || aux->animal.fechaNac.dd < 1){ printf("Dia:"); scanf("%d",&aux->animal.fechaNac.dd); } printf("Mes:"); scanf("%d",&aux->animal.fechaNac.mm); while(aux->animal.fechaNac.mm > 12 || aux->animal.fechaNac.mm < 1){ printf("Mes:"); scanf("%d",&aux->animal.fechaNac.mm); } printf("Anio:"); scanf("%d",&aux->animal.fechaNac.aa); while(aux->animal.fechaNac.aa > 3000 || aux->animal.fechaNac.aa < 1900){ printf("Anio:"); scanf("%d",&aux->animal.fechaNac.aa); } break; case SEXO: printf("Ingrese nuevo sexo: (M o F)"); scanf("%c",&aux->animal.sexo); break; case PATHFOTO: printf("Ingrese la nueva ruta de la foto: (Ej: C://animal.jpg)"); scanf("%s",aux->animal.archFoto); break; } }; return; } else{ aux=aux->sig; if(aux==NULL){ printf("El Id ingresado no es validon"); } } }} /*completa*/ void fotoanimal (pNodo cabeza){ int id=0; char start[MAX]={"start "}; printf("Ingrese el id del animal a mostrarn"); scanf("%d",&id); while(cabeza!=NULL){ if(cabeza->animal.identificador==id){ system(strcat(start,cabeza->animal.archFoto)); cabeza=NULL; } else{ cabeza=cabeza->sig; if(cabeza==NULL){ printf("El Id ingresado no es validon"); } } } }/*completa*/ void infconsultas(pNodo cabeza){ FILE *consultas; sconsulta consulta; struct tm *OurT=NULL; int id=0; char c[MIX]={"c"}; char txt[MIX]= {".txt"}; char nombre[MAX]; printf("ingrese id animal que realizo la consulta:n"); scanf("%d",&id); while(cabeza!=NULL){ if(cabeza->animal.identificador==id){ printf("Ingrese datos de la consulta"); printf("Ingrese motivo de la consulta:n"); gets(consulta.motivo); printf("Ingrese diagnostico:n"); gets(consulta.diagnostico); printf("Ingrese tratamiento:n"); gets(consulta.tratamiento); printf("Ingrese veterinario que los reviso:n"); gets(consulta.veterinario); consulta.fechacontrol.dd=OurT->tm_yday; consulta.fechacontrol.mm=OurT->tm_mon; consulta.fechacontrol.aa=OurT->tm_year; sprintf(nombre,"%d%s%d%d%d%d%d%s",id,c,OurT->tm_yday,OurT->tm_mon,OurT->tm_year,OurT->tm_hour,OurT->tm_min,txt); consultas=fopen("nombre","wt"); fprintf(consultas,"%s%s%s%s%d%d%d",consulta.motivo,consulta.diagnostico,consulta.tratamiento,consulta.veterinario,consulta.fechacontrol.dd,consulta.fechacontrol.mm,consulta.fechacontrol.aa); return; } else{ cabeza=cabeza->sig; if(cabeza==NULL){ printf("El Id ingresado no es validon"); } } }}/*completa*/void infalergias(pNodo cabeza){ FILE *alergias; salergia alergia; struct tm *OurT=NULL; int id=0; char c[MIX]={"a"}; char txt[MIX]= {".txt"}; char nombre[MAX]; printf("ingrese id animal con alergias:n"); scanf("%d",&id); while(cabeza!=NULL){ if(cabeza->animal.identificador==id){ printf("Ingrese datos de la alergia"); printf("Ingrese nombre de la alergia:n"); gets(alergia.alergia); printf("Ingrese tratamiento:n"); gets(alergia.trata); printf("Ingrese observaciones:n"); gets(alergia.observ); alergia.fecha.dd=OurT->tm_yday; alergia.fecha.mm=OurT->tm_mon; alergia.fecha.aa=OurT->tm_year; sprintf(nombre,"%d%s%d%d%d%d%d%s",id,c,OurT->tm_yday,OurT->tm_mon,OurT->tm_year,OurT->tm_hour,OurT->tm_min,txt); alergias=fopen("nombre","wt"); fprintf(alergias,"%s%s%s%d%d%d",alergia.alergia,alergia.trata,alergia.observ,alergia.fecha.dd,alergia.fecha.mm,alergia.fecha.aa); return; } else{ cabeza=cabeza->sig; if(cabeza==NULL){ printf("El Id ingresado no es validon"); } } }}/*completa*/void infvacunacion(pNodo cabeza){ FILE *vacunas; svacuna vacuna; struct tm *OurT=NULL; int id=0; char c[MIX]={"v"}; char txt[MIX]= {".txt"}; char nombre[MAX]; printf("ingrese id animal que recibio vacunas:n"); scanf("%d",&id); while(cabeza!=NULL){ if(cabeza->animal.identificador==id){ printf("Ingrese datos de la vacuna"); printf("Ingrese nombre de la vacuna:n"); gets(vacuna.vacuna); printf("Ingrese plan sanitario:n"); gets(vacuna.plansatinario); printf("Ingrese plan de aplicacion:n"); gets(vacuna.planaplicacion); printf("Ingrese observacions:n"); gets(vacuna.observaciones); vacuna.fechavenc.dd=OurT->tm_yday; vacuna.fechavenc.mm=OurT->tm_mon; vacuna.fechavenc.aa=OurT->tm_year; sprintf(nombre,"%d%s%d%d%d%d%d%s",id,c,OurT->tm_yday,OurT->tm_mon,OurT->tm_year,OurT->tm_hour,OurT->tm_min,txt); vacunas=fopen("nombre","wt"); fprintf(vacunas,"%s%s%s%s%d%d%d",vacuna.vacuna,vacuna.plansatinario,vacuna.planaplicacion,vacuna.observaciones,vacuna.fechavenc.dd,vacuna.fechavenc.mm,vacuna.fechavenc.aa); return; } else{ cabeza=cabeza->sig; if(cabeza==NULL){ printf("El Id ingresado no es validon"); } } } }/*completa*/ void hiscomp(pNodo cabeza){ } void guardararchivo(pNodo *cabeza){ FILE *animales; pNodo auxiliar; char aux[100]; char aux2[100]; auxiliar=*cabeza; strcpy(aux,ruta); strcpy(aux2,"veterinaria.dat"); strcat(aux,aux2); printf("%s",aux2); animales=fopen("aux","wb"); while(auxiliar!=NULL){ fwrite(&auxiliar,sizeof(nodo),1,animales); auxiliar=auxiliar->sig; }}/*completa*/
ProfesorX:
Hola nicksynm, por lo poco que pude leer de la descripcion de tu problema, me parece que estas enfocando mal la manera en que lo debes de resolver, asi que te dare algunos consejos de lo que deberias hacer, a menos claro, que especificamente te dijeron que lo tienes que hacer como lo estas haciendo.
Para empezar, te dire que no es posible abrir varios archivos con un mismo fopen(), no sirve de nada usar comodines (* o ?), los comodines solo sirven PARA LISTAR LOS ARCHIVOS QUE CONTIENE UN DIRECTORIO, MAS NO PARA ABRIRLOS. Por lo tanto la sentencia que pones archivo=fopen("idc*","rt") no es valida. Cada archivo que abres necesita un apuntador de archivo (FILE*), o sea que para abrir 10 archivos simultaneamente, necesitarias 10 apuntadores de archivo. Pero ademas tienes un detalle, supon que tienes 50 mascotas, y que cada mascota tiene 20 consultas, eso haria un total de 100 archivos que tienes que abrir. algo muy dificl de manejar. Ademas en tu disco tendrias 100 archivos, cada archivo con solo una linea de texto, lo que no es nada practico.
En lugar de eso, yo diria que manejaras solo 4 archivos:
Archivo 1. Todos los datos de todos los perros. (id, nombre, raza, dueño, etc)
Archivo 2. Consultas de todos los perros (id, datos de la consulta)
Archivo 3. Vacunaciones de todos los perros (id, datos de las vacunaciones)
Archivo 4. Alergias de todos los perros (id, datos de las alergias)
Si te fijas, en el primer archivo irian todos los datos de cada uno de los perros, incluyendo un campo id, que seria unico para cada perro, para saber cuando nos referimos a un perro, y cuando nos referimos a otro diferente.
En los archivos siguientes, ya no repetiriamos los datos, solamente pondriamos el id, que es el que identifica al perro, asi sabemos que "X" datos pertenecen a "X" perro, por el id o clave unica.
Entonces, cuando queremos saber que consultas ha tenido el perro "X", simplemente pedimos su id, y entonces leemos todo el archivo, pero solamente mostramos en pantalla aquellas consultas cuya id del perro sea igual a la id del perro que queremos.
Espero que con estso consejos puedas resolver mejor tu porblema.
Saludos :)
nicksynm:
Yo por mi, lo haria como vos decis, lo cual seria mucho muchisimo más facil. Pero me dijieron que cada animal deberia tener una archivo por cada consulta, cada vacuna y cada alergia. Por eso, sino ya tendria resuelto todo.
Lo peor es cuando creo los archivos los nombres son generados con fecha y hora, por lo tanto aunque quisiera no se los nombras de los archivos. Asi que supongo que tiene que haber una manera con sprintf, o algo parecido, pero no se me ocurre nada.
nicksynm:
Creo que se me ocurrio una manera. Como veras yo uso el sprintf para asignarle el nombre a los archivos de consulta vacunas alergias. No podria yo agregarle el comodin a la cadena que creo con el sprintf y despues usar el fopen con esa cadena?.
ProfesorX:
--- Citar ---No podria yo agregarle el comodin a la cadena que creo con el sprintf y despues usar el fopen con esa cadena?.
--- Fin de la cita ---
Ya te dije que no se puede, no importa como lo hagas, fopen() no admite comodines, solo permite abrir un archivo a la vez por cada apuntador.
En ese caso, lo que podrias hacer, es leer el directorio en base a comodines, (eso si se puede hacer, ya que solo lees los nombres de archivo, no estas abriendo los archivos en si) y entonces por cada nombre de archivo que encuentres que coincida con tu busqueda, lo abres, lees la informacion, lo cierras y lees el siguiente archivo que coincida.
El problema es que la manera de leer los nombres de archivo que contiene un directorio, es dependendiente de la plataforma, es decir, del sistema operativo que estas utilizando.
Desconozco que plataforma y compilador utilizas, pero, suponiendo que usas Visual C++ y windows :P, te muestro un codigo que lee un directorio determinado, utiliza las funciones FindFirstFile, FindNextFile, y FindClose de aqui podrias tomar la base para obtener los nombres de archivo. Esta tomado de la siguiente direccion:
http://msdn.microsoft.com/en-us/library/aa365200%28VS.85%29.aspx
--- Código: C ---#include <windows.h>#include <tchar.h> #include <stdio.h>#include <strsafe.h> void DisplayErrorBox(LPTSTR lpszFunction); int _tmain(int argc, TCHAR *argv[]){ WIN32_FIND_DATA ffd; LARGE_INTEGER filesize; TCHAR szDir[MAX_PATH]; size_t length_of_arg; HANDLE hFind = INVALID_HANDLE_VALUE; DWORD dwError=0; // If the directory is not specified as a command-line argument, // print usage. if(argc != 2) { _tprintf(TEXT("nUsage: %s <directory name>n"), argv[0]); return (-1); } // Check that the input path plus 3 is not longer than MAX_PATH. // Three characters are for the "*" plus NULL appended below. StringCchLength(argv[1], MAX_PATH, &length_of_arg); if (length_of_arg > (MAX_PATH - 3)) { _tprintf(TEXT("nDirectory path is too long.n")); return (-1); } _tprintf(TEXT("nTarget directory is %snn"), argv[1]); // Prepare string for use with FindFile functions. First, copy the // string to a buffer, then append '*' to the directory name. StringCchCopy(szDir, MAX_PATH, argv[1]); StringCchCat(szDir, MAX_PATH, TEXT("\*")); // Esta seria una de las partes clave, encuentra el primer archivo // que coincida con el nombre y comodin especificado (szDir). // Find the first file in the directory. hFind = FindFirstFile(szDir, &ffd); if (INVALID_HANDLE_VALUE == hFind) { DisplayErrorBox(TEXT("FindFirstFile")); return dwError; } // Esta es la otra parte clave, el ciclo que impirme el nombre del archivo // y sigue buscando el nombre del siguiente archivo que coincida con el // comodin por medio de FindNextFile // List all the files in the directory with some info about them. do { if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { _tprintf(TEXT(" %s <DIR>n"), ffd.cFileName); } else { filesize.LowPart = ffd.nFileSizeLow; filesize.HighPart = ffd.nFileSizeHigh; _tprintf(TEXT(" %s %ld bytesn"), ffd.cFileName, filesize.QuadPart); } } while (FindNextFile(hFind, &ffd) != 0); dwError = GetLastError(); if (dwError != ERROR_NO_MORE_FILES) { DisplayErrorBox(TEXT("FindFirstFile")); } FindClose(hFind); return dwError;} void DisplayErrorBox(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the error message and clean up lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf);}
Si te fijas, el nombre de archivo esta contenido en ffd.cFileName, entonces con eso simplemente harias un fopen(ffd.cFileName) para abrir el archivo. Si te fijas, hay un ciclo que utiliza FindFirstFile y FindNextFile para leer todos los nombres de archivo que coincidan con el comodin especificado. Entonces la apertura/lectura/cerrado de cada archivo tendrias que hacerla en un ciclo :P
Busca mas informacion en MSDN sobre FindFirstFile, FindNextFile, y FindClose si utilizas windows.
Ahora, si utilizas otro sistema operativo y otro compilador, tendiras que buscar la informacion por tu cuenta, ya que yo solo trabajo bajo windows :P.
Saludos :)
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa