Archivos en Lenguaje C

Iniciado por Nachillo, 15 Agosto 2015, 02:03 AM

0 Miembros y 1 Visitante están viendo este tema.

Nachillo

Primero que nada muchas gracias de ante mano por darse el tiempo de leer mi duda...

es la primera vez que me atrevo a preguntar en un foro, por que tengo una duda sobre

el Lenguaje C, Es lo siguiente es sobre los Archivos, se usar y crear archivos para guardar datos, usar el 'fprintf' y se guarda en el archivo de texto..  pero mi duda es que si lo puedo usar como una base de datos muy básica. UN EJEMPLO:
-Si tuviera un programa que guarda el nombre de 10 personas y cuando terminara el programa ya se que mi archivo de texto se encuentra con los 10 nombres el problema es que cuando entro al programa nuevamente y tengo una función de buscar, con el nombre, al acceder yo el nombre, ya no puede buscar nada, solamente cuando yo no he cerrado el programa y apenas voy metiendo los 10 nombres, quisiera que pudiese leer una linea y no todo el archivo, es posible esto?? si, si es posible me podrían explicar como hacerlo, no se si me explique bien. Solo quiero que lea una parte del archivo y no todo. Muchas gracias de ante mano, soy novato en esto de la programación, me encantaría contar con ayuda de alguien.  y si yo pudiera a ayudar a alguien con gusto y con mis pocos conocimientos lo haría, muchísimas gracias.. Adios...  ;D

ivancea96

Lo que puedes hacer es, leer primero el archivo completo en una variable char*, y luego trabajar sobre ese archivo. Si quieres coger linea a linea, recorres el char* hasta encontrar un caracter '\n'. Una vez lo encuentres, sabes que lo que hay entre el '\n' anterior y este, es una linea. Puedes guardar la linea en otra variable, copiandola, si se te hace más fácil que trabajar con índices o con punteros.

Ve haciendolo por partes.

Nachillo

#2
MUCHISIMAS GRACIAS por contestar  y dar un poco de tiempo.

mira este es el código que estaba haciendo por el ejemplo que describí en mi pregunta.

y me encontre con otro problema y es que Cuando agrego una persona, va bien y lo puedo buscar pero cuando agrego otra persona ya no puedo buscarla me lanza el mensaje que puse ahi que si no encontraba el nombre dijera el mensaje de ""El nombre NO existe.", como se puede solucionar el problema, Si es posible pudiera EXPLICARME que he batallado con esto de los archivos. de ante mano Muchas Gracias. :D


// Ejemplo para el blog.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50
#define G 10


//Prototipos
void funcion();
void agregar();
void vacio();
void cambio();
void buscar();


//Estructura
typedef struct{
//Variable para saber si ya esta ocupado el lugar con un nombre.
int lleno;
//Variable para el nombre.
char nombre[N];
//variable para almacenar su edad
int edad;

}Personas;

Personas per[G];


int main(){


funcion();

system("pause");
return 0;
}


//Funcion para vaciar todas las estructuras y poner su vacriable lleno en 0;
void vacio(){
int i;

for(i=0; i < G ; i++){
per[i].lleno=0;
}
}

//Funcion para quitar el \n de los strings y poner \0
void cambio(char palabra[N]){
int i;

for(i=0; i<N; i++){
if(palabra[i] =='\n'){
palabra[i]='\0';
}
}

}

//Funcion que muestra el menu y da a eligir lo que se desea hacer.
void funcion(){
int op;
char key;

//Funcion para vaciar todas las estructuras y poner su vacriable lleno en 0;
vacio();

do{
do{
printf("Elige una opcion:\n");
printf("(1) Agregar una persona.\n");
printf("(2) Buscar una persona.\n");
printf("(3) Salir.\n");
scanf("%d", &op);
}while(op < 1 || op > 4);

switch(op){
case 1:{
agregar();
break;
}

case 2:{
buscar();
break;
}
}

if(op == 3){
printf("Has salido..\n");
break;
}
else{
printf("Quieres volver al menu[S/N]");
fflush(stdin);
scanf("%c", &key);
system("cls");
}

}while(key == 'S' || key == 's');


}


void agregar(){
int i,aux=0;
char *nombre_archi="datos.txt";
//Crear archivo.
FILE *archivo;
//Abrir Archivo con 'a' para agregar al final.
archivo=fopen(nombre_archi, "a");


for(i=0; i < G && aux==0; i++){
if(per[i].lleno==0){
printf("Escriba el nombre: ");
fflush(stdin);
fgets(per[i].nombre, N, stdin);
//Corrige el error de fgets.
cambio(per[i].nombre);

fprintf(archivo,"%s..",per[i].nombre);

printf("Edad: ");
fflush(stdin);
scanf("%d", &per[i].edad);
//añadir al bloc de notas
fprintf(archivo,"%d\n",per[i].edad);
//Llenar esta estructura para que no se vuelva a utilizar
per[i].lleno=1;
//Ruta de escape
aux=1;
}
}



}

void buscar(){
int i,aux=0;
char nombretemp[N];
//Poner el bloc de notas en modo lectura.
FILE* archivo;
char* nombre_archi="datos.txt";

archivo=fopen(nombre_archi,"r");

printf("Introduzca nombre: ");
fflush(stdin);
fgets(nombretemp,N,stdin);
cambio(nombretemp);

for(i=0; i < G && aux == 0; i++){
if(strcmp(nombretemp,per[i].nombre)==0){
printf("Nombre: %s\n", per[i].nombre);
printf("Edad: %d\n", per[i].edad);
aux=1;
}

else{
printf("El nombre NO existe.\n");
aux=1;
}

}

}






DarK_FirefoX

#3
No entendí muy bien, pero dime si es esto:

¿El problema que tienes es que cuando agregas 1 persona, y despues la busca, la encuentra bien y te da que la encontró, luego añades otra persona e intentas buscar de nuevo (cualquiera de las 2) y no encuentra ninguna?

Te pregunto para ver si entiendo bien cual es el problema.

Salu2s

Añado PD: Utiliza las etiquetas GeSHi para publicar código de acuerdo al lenguaje de programación que estés usando. Para usarlo debes utilizar el ComboBox a la derecha del botón de cambiar el Tipo De Fuente (osea, la A roja), y seleccionar el lenguaje y luego poner tu código dentro de las etiquetas que te aparecen. Esto facilitará la lectura del código.

Nachillo

Muchas gracias por contestar, Si disculpe es que no sabia como usarlo, soy nuevo recién ingrese al foro ayer.

Sobre mi duda:
No el problema es que cuando agrego a una persona y la busco la encuentra, pero cuando ingreso a otra y la busco me dice que no la encuentra. En pocas palabra el programa solo encuentra ala primer persona que he ingresado.

Agradecería mucho que me ayudaran.  ;D



// Ejemplo para el blog.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 50
#define G 10


//Prototipos
void funcion();
void agregar();
void vacio();
void cambio();
void buscar();


//Estructura
typedef struct{
//Variable para saber si ya esta ocupado el lugar con un nombre.
int lleno;
//Variable para el nombre.
char nombre[N];
//variable para almacenar su edad
int edad;

}Personas;

Personas per[G];


int main(){


funcion();

system("pause");
return 0;
}


//Funcion para vaciar todas las estructuras y poner su vacriable lleno en 0;
void vacio(){
int i;

for(i=0; i < G ; i++){
per[i].lleno=0;
}
}

//Funcion para quitar el \n de los strings y poner \0
void cambio(char palabra[N]){
int i;

for(i=0; i<N; i++){
if(palabra[i] =='\n'){
palabra[i]='\0';
}
}

}

//Funcion que muestra el menu y da a eligir lo que se desea hacer.
void funcion(){
int op;
char key;

//Funcion para vaciar todas las estructuras y poner su vacriable lleno en 0;
vacio();

do{
do{
printf("Elige una opcion:\n");
printf("(1) Agregar una persona.\n");
printf("(2) Buscar una persona.\n");
printf("(3) Salir.\n");
scanf("%d", &op);
}while(op < 1 || op > 4);

switch(op){
case 1:{
agregar();
break;
}

case 2:{
buscar();
break;
}
}

if(op == 3){
printf("Has salido..\n");
break;
}
else{
printf("Quieres volver al menu[S/N]");
fflush(stdin);
scanf("%c", &key);
system("cls");
}

}while(key == 'S' || key == 's');


}


void agregar(){
int i,aux=0;
char *nombre_archi="datos.txt";
//Crear archivo.
FILE *archivo;
//Abrir Archivo con 'a' para agregar al final.
archivo=fopen(nombre_archi, "a");


for(i=0; i < G && aux==0; i++){
if(per[i].lleno==0){
printf("Escriba el nombre: ");
fflush(stdin);
fgets(per[i].nombre, N, stdin);
//Corrige el error de fgets.
cambio(per[i].nombre);

fprintf(archivo,"%s..",per[i].nombre);

printf("Edad: ");
fflush(stdin);
scanf("%d", &per[i].edad);
//añadir al bloc de notas
fprintf(archivo,"%d\n",per[i].edad);
//Llenar esta estructura para que no se vuelva a utilizar
per[i].lleno=1;
//Ruta de escape
aux=1;
}
}



}

void buscar(){
int i,aux=0;
char nombretemp[N];
//Poner el bloc de notas en modo lectura.
FILE* archivo;
char* nombre_archi="datos.txt";

archivo=fopen(nombre_archi,"r");

printf("Introduzca nombre: ");
fflush(stdin);
fgets(nombretemp,N,stdin);
cambio(nombretemp);

for(i=0; i < G && aux == 0; i++){
if(strcmp(nombretemp,per[i].nombre)==0){
printf("Nombre: %s\n", per[i].nombre);
printf("Edad: %d\n", per[i].edad);
aux=1;
}

else{
printf("El nombre NO existe.\n");
aux=1;
}

}

}