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
}
<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.
Un ejemplo masomenos ?
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)
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
#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;
}
Los ficheros en C son <FILE*>.
Busca información sobre trabajar con ficheros en C para orientarte más.