Asunto con archivos C

Iniciado por Jay, 29 Mayo 2019, 08:13 AM

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

Jay

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





FILE *archivo;
void reservaciones(){
char claveHabitacion[][20]= {"ST1"};
char *ptr=claveHabitacion[0];

archivo = fopen("ejemplo.txt", "a+");
fprintf(archivo, "\n La clave es: %s", ptr);
fwrite(&ptr, sizeof(ptr), 1, archivo);

}


//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

fread(); // se me ocurrio leer





}








K-YreX

<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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Jay


K-YreX

Supongamos que tienes un fichero "datos.txt" cuyo contenido es:

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.


#define MAX_SIZE 100 // longitud para guardar una palabra

int main(){
    FILE *fichero;
    fichero = fopen("datos.txt", "r"); // abrimos el fichero en modo lectura
    char *clave_buscada = "ST2"; // clave que queremos buscar
    char palabra_actual[MAX_SIZE], estado_buscado[MAX_SIZE];
    bool encontrado = false; // si no quieres usar <stdbool.h> usa int encontrado = 0

    fgets(palabra_actual, MAX_SIZE, fichero); // guardamos la primera linea que no sirve para nada
    while(!feof(fichero) and !encontrado){ // mientras no lleguemos al final del fichero y no hayamos encontrado la palabra que buscamos
        fscanf(fichero, "%s", palabra_actual); // guardamos una palabra
        fgets(estado_buscado, MAX_SIZE, fichero); // guardamos el resto de la linea
        if(strncmp(clave_buscada, palabra_actual, 3) == 0) // comparamos los 3 primeros caracteres con la clave que buscamos y si son iguales...
            encontrado = true; // ...indicamos que ya la hemos encontrado para salir antes del bucle. Si no se ha usado bool, cambiar por encontrado = 1
    }

    if(encontrado) // si la hemos encontrado
        printf("La informacion de %s es: %s\n", clave_buscada, estado_buscado);
}

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)
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Jay

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 (cpp) [Seleccionar]



#include<cstdlib>
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
void altas();
void bajas();
void buscar();
void consultas();
void modificaciones();
void salir();
void menu();
//Variables Globales
char nombre[30],grupo[10],resp[1];
int semestre=0, edad=0;
bool encontrado=false;
char auxGrupo[10];
int main(){
    menu();
    return 0;
    system("PAUSE");
}
void menu(){
    int opcion=0;
    do{
        cout<<"Manejo de Archivos en C++"<<endl;
        cout<<"1. Altas"<<endl;
        cout<<"2. Bajas"<<endl;
        cout<<"3. Consultas"<<endl;
        cout<<"4. Buscar un Registro"<<endl;
        cout<<"5. Modificaciones"<<endl;
        cout<<"6. Salir"<<endl;
        cout<<"Que deseas hacer? ";
        cin>>opcion;
        switch(opcion){
            case 1:
                altas();
            break;
            case 2:
                bajas();
            break;
            case 3:
                consultas();
            break;
            case 4:
                buscar();
            break;
            case 5:
                modificaciones();
            break;
            case 6:
                salir();
            break;
            default:
                cout<<"¡Opcion Incorrecta!"<<endl;
        }
    }while(opcion!=6);
}//Fin funcion menu
void altas(){
    ofstream escritura;
    escritura.open("alumnos.txt",ios::out|ios::app);
    if(escritura.is_open()){
        cout<<"Ingresa el nombre del Alumno: ";
        cin>>nombre;
        cout<<"Ingresa el Semestre del Alumno: ";
        cin>>semestre;
        cout<<"Ingresa el Grupo del Alumno: ";
        cin>>grupo;
        cout<<"Ingresa la Edad del Alumno: ";
        cin>>edad;
        escritura<<nombre<<" "<<semestre<<" "<<grupo<<" "<<edad<<endl;
    }else{
        cout<<"Error, el Archivo No se Pudo Abrir"<<endl;
    }
    escritura.close();
}//Fin funcion altas

void consultas(){
    ifstream lectura;
    lectura.open("alumnos.txt",ios::out|ios::in);
    if(lectura.is_open()){
        cout<<"Registros del Archivo alumnos.txt"<<endl;
        cout<<"________________________________"<<endl;
        lectura>>nombre;
        while(!lectura.eof()){
            lectura>>semestre;
            lectura>>grupo;
            lectura>>edad;
            cout<<"Nombre: "<<nombre<<endl;
            cout<<"Semestre: "<<semestre<<endl;
            cout<<"Grupo: "<<grupo<<endl;
            cout<<"Edad: "<<edad<<endl;
            lectura>>nombre;
            cout<<"________________________________"<<endl;
        }
    }else{
        cout<<"Error, el Archivo No se Pudo Abrir, No ha sido creado"<<endl;
    }
    lectura.close();
}//Fin funcion consultas

void bajas(){
}
void buscar(){
    ifstream lectura;//Creamos la variable de tipo lectura
    lectura.open("alumnos.txt",ios::out|ios::in);//Abrimos el archivo
    //validando la apertura del archivo
    if(lectura.is_open()){
        cout<<"Ingresa el Grupo que deseas Buscar: ";
        cin>>auxGrupo;
        lectura>>nombre;//lectura adelantada
        encontrado=false;
        while(!lectura.eof()){
            lectura>>semestre>>grupo>>edad;//leyendo los campos del registro
            //Comparar cada registro para ver si es encontrado
            if(strcmp(auxGrupo,grupo)==0){
                cout<<"______________________________"<<endl;
                cout<<"Nombre: "<<nombre<<endl;
                cout<<"Semestre: "<<semestre<<endl;
                cout<<"Grupo: "<<grupo<<endl;
                cout<<"Edad: "<<edad<<endl;
                cout<<"______________________________"<<endl;
                encontrado=true;
            }
            lectura>>nombre;//lectura adelantada
        }
        if(encontrado==false){
            cout<<"No hay registros con el Grupo "<<auxGrupo<<endl;
        }
    }else{
        cout<<"No se pudoAbrir el Archivo, aun no ha sido Creado"<<endl;
    }
    //cerrando el archivo
    lectura.close();
}
void modificaciones(){
}
void salir(){
    cout<<"Programa Finalizado"<<endl;
}





K-YreX

Los ficheros en C son <FILE*>.
Busca información sobre trabajar con ficheros en C para orientarte más.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;