Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jay en 29 Mayo 2019, 08:13 am



Título: Asunto con archivos C
Publicado por: Jay en 29 Mayo 2019, 08:13 am
Hola como estan, tengo una duda sobre archivos en c. Bueno lo que pasa es que requiero buscar algo dentro del archivo que acabo de crear es decir por ejemplo si pongo la clave ST1 me salga la informacion de eso en pantalla dicha informacion se encuentra en el archivo



Código
  1.  
  2. FILE *archivo;
  3. void reservaciones(){
  4. char claveHabitacion[][20]= {"ST1"};
  5. char *ptr=claveHabitacion[0];
  6.  
  7. archivo = fopen("ejemplo.txt", "a+");
  8. fprintf(archivo, "\n La clave es: %s", ptr);
  9. fwrite(&ptr, sizeof(ptr), 1, archivo);
  10.  
  11. }
  12.  
  13.  
  14. //main(){ //Aqui es donde deberia escribir ST1 y que me saliera la informacion que llegase a guardar ahi. como seria para buscar dentro del archivo y llamarlo desde el main
  15.  
  16. fread(); // se me ocurrio leer
  17.  
  18.  
  19.  
  20.  
  21.  
  22. }
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  


Título: Re: Asunto con archivos C
Publicado por: K-YreX en 29 Mayo 2019, 08:35 am
<fwrite()/fread()> son funciones para trabajar con ficheros en modo binario. Te recomiendo que no uses esos y te limites a usar <fgets> para leer cadenas del fichero y <fprintf()> para escribirlas.
Lo que debes hacer es abrir el fichero en modo lectura e ir leyendo por ejemplo la primera palabra de cada línea, si esta coincide con la que buscas, guardas el resto de la línea en otra variable y terminas. Si no coincide, lees el resto de la línea (porque el acceso es secuencial, no aleatorio) y pruebas con la primera palabra de la siguiente línea.


Título: Re: Asunto con archivos C
Publicado por: Jay en 29 Mayo 2019, 21:01 pm
Un ejemplo masomenos ?


Título: Re: Asunto con archivos C
Publicado por: K-YreX en 29 Mayo 2019, 21:27 pm
Supongamos que tienes un fichero "datos.txt" cuyo contenido es:
Código:
ESTADO HABITACIONES
ST1 Libre
ST2 Ocupada
ST3 Libre
Que indica la clave de cada habitación y si está Libre/Ocupada. Y queremos buscar el estado de una habitación en concreto.

Código
  1. #define MAX_SIZE 100 // longitud para guardar una palabra
  2.  
  3. int main(){
  4.    FILE *fichero;
  5.    fichero = fopen("datos.txt", "r"); // abrimos el fichero en modo lectura
  6.    char *clave_buscada = "ST2"; // clave que queremos buscar
  7.    char palabra_actual[MAX_SIZE], estado_buscado[MAX_SIZE];
  8.    bool encontrado = false; // si no quieres usar <stdbool.h> usa int encontrado = 0
  9.  
  10.    fgets(palabra_actual, MAX_SIZE, fichero); // guardamos la primera linea que no sirve para nada
  11.    while(!feof(fichero) and !encontrado){ // mientras no lleguemos al final del fichero y no hayamos encontrado la palabra que buscamos
  12.        fscanf(fichero, "%s", palabra_actual); // guardamos una palabra
  13.        fgets(estado_buscado, MAX_SIZE, fichero); // guardamos el resto de la linea
  14.        if(strncmp(clave_buscada, palabra_actual, 3) == 0) // comparamos los 3 primeros caracteres con la clave que buscamos y si son iguales...
  15.            encontrado = true; // ...indicamos que ya la hemos encontrado para salir antes del bucle. Si no se ha usado bool, cambiar por encontrado = 1
  16.    }
  17.  
  18.    if(encontrado) // si la hemos encontrado
  19.        printf("La informacion de %s es: %s\n", clave_buscada, estado_buscado);
  20. }
Se puede usar una sola variable (palabra_actual / estado). He usado 2 para que se vea más visual lo que hacemos. La clave yo la he elegido como he querido, lo suyo es pedírsela al usuario y elegir el formato que tendrá tu fichero y adaptarlo para que funcione. En el ejemplo te muestro cómo funciona tanto <fgets()> como <fscanf()> para que veas las diferencias.
El resto ya te queda a ti. :-X
(El código no lo he probado por lo que puede tener algún error del que no me haya dado cuenta)


Título: Re: Asunto con archivos C
Publicado por: Jay en 30 Mayo 2019, 00:46 am
si medio te entiendo estuve realizando este en c++ algo asi necesito pero no se como pasarlo a c ahi diferencias por ejemplo la librerai fstream no se como seria en c si puedieras orientarme un poco
Código
  1.  
  2.  
  3. #include<cstdlib>
  4. #include<iostream>
  5. #include<fstream>
  6. #include<string.h>
  7. using namespace std;
  8. void altas();
  9. void bajas();
  10. void buscar();
  11. void consultas();
  12. void modificaciones();
  13. void salir();
  14. void menu();
  15. //Variables Globales
  16. char nombre[30],grupo[10],resp[1];
  17. int semestre=0, edad=0;
  18. bool encontrado=false;
  19. char auxGrupo[10];
  20. int main(){
  21.    menu();
  22.    return 0;
  23.    system("PAUSE");
  24. }
  25. void menu(){
  26.    int opcion=0;
  27.    do{
  28.        cout<<"Manejo de Archivos en C++"<<endl;
  29.        cout<<"1. Altas"<<endl;
  30.        cout<<"2. Bajas"<<endl;
  31.        cout<<"3. Consultas"<<endl;
  32.        cout<<"4. Buscar un Registro"<<endl;
  33.        cout<<"5. Modificaciones"<<endl;
  34.        cout<<"6. Salir"<<endl;
  35.        cout<<"Que deseas hacer? ";
  36.        cin>>opcion;
  37.        switch(opcion){
  38.            case 1:
  39.                altas();
  40.            break;
  41.            case 2:
  42.                bajas();
  43.            break;
  44.            case 3:
  45.                consultas();
  46.            break;
  47.            case 4:
  48.                buscar();
  49.            break;
  50.            case 5:
  51.                modificaciones();
  52.            break;
  53.            case 6:
  54.                salir();
  55.            break;
  56.            default:
  57.                cout<<"¡Opcion Incorrecta!"<<endl;
  58.        }
  59.    }while(opcion!=6);
  60. }//Fin funcion menu
  61. void altas(){
  62.    ofstream escritura;
  63.    escritura.open("alumnos.txt",ios::out|ios::app);
  64.    if(escritura.is_open()){
  65.        cout<<"Ingresa el nombre del Alumno: ";
  66.        cin>>nombre;
  67.        cout<<"Ingresa el Semestre del Alumno: ";
  68.        cin>>semestre;
  69.        cout<<"Ingresa el Grupo del Alumno: ";
  70.        cin>>grupo;
  71.        cout<<"Ingresa la Edad del Alumno: ";
  72.        cin>>edad;
  73.        escritura<<nombre<<" "<<semestre<<" "<<grupo<<" "<<edad<<endl;
  74.    }else{
  75.        cout<<"Error, el Archivo No se Pudo Abrir"<<endl;
  76.    }
  77.    escritura.close();
  78. }//Fin funcion altas
  79.  
  80. void consultas(){
  81.    ifstream lectura;
  82.    lectura.open("alumnos.txt",ios::out|ios::in);
  83.    if(lectura.is_open()){
  84.        cout<<"Registros del Archivo alumnos.txt"<<endl;
  85.        cout<<"________________________________"<<endl;
  86.        lectura>>nombre;
  87.        while(!lectura.eof()){
  88.            lectura>>semestre;
  89.            lectura>>grupo;
  90.            lectura>>edad;
  91.            cout<<"Nombre: "<<nombre<<endl;
  92.            cout<<"Semestre: "<<semestre<<endl;
  93.            cout<<"Grupo: "<<grupo<<endl;
  94.            cout<<"Edad: "<<edad<<endl;
  95.            lectura>>nombre;
  96.            cout<<"________________________________"<<endl;
  97.        }
  98.    }else{
  99.        cout<<"Error, el Archivo No se Pudo Abrir, No ha sido creado"<<endl;
  100.    }
  101.    lectura.close();
  102. }//Fin funcion consultas
  103.  
  104. void bajas(){
  105. }
  106. void buscar(){
  107.    ifstream lectura;//Creamos la variable de tipo lectura
  108.    lectura.open("alumnos.txt",ios::out|ios::in);//Abrimos el archivo
  109.    //validando la apertura del archivo
  110.    if(lectura.is_open()){
  111.        cout<<"Ingresa el Grupo que deseas Buscar: ";
  112.        cin>>auxGrupo;
  113.        lectura>>nombre;//lectura adelantada
  114.        encontrado=false;
  115.        while(!lectura.eof()){
  116.            lectura>>semestre>>grupo>>edad;//leyendo los campos del registro
  117.            //Comparar cada registro para ver si es encontrado
  118.            if(strcmp(auxGrupo,grupo)==0){
  119.                cout<<"______________________________"<<endl;
  120.                cout<<"Nombre: "<<nombre<<endl;
  121.                cout<<"Semestre: "<<semestre<<endl;
  122.                cout<<"Grupo: "<<grupo<<endl;
  123.                cout<<"Edad: "<<edad<<endl;
  124.                cout<<"______________________________"<<endl;
  125.                encontrado=true;
  126.            }
  127.            lectura>>nombre;//lectura adelantada
  128.        }
  129.        if(encontrado==false){
  130.            cout<<"No hay registros con el Grupo "<<auxGrupo<<endl;
  131.        }
  132.    }else{
  133.        cout<<"No se pudoAbrir el Archivo, aun no ha sido Creado"<<endl;
  134.    }
  135.    //cerrando el archivo
  136.    lectura.close();
  137. }
  138. void modificaciones(){
  139. }
  140. void salir(){
  141.    cout<<"Programa Finalizado"<<endl;
  142. }
  143.  
  144.  
  145.  
  146.  
  147.  


Título: Re: Asunto con archivos C
Publicado por: K-YreX en 30 Mayo 2019, 09:08 am
Los ficheros en C son <FILE*>.
Busca información sobre trabajar con ficheros en C para orientarte más.