Pequeña duda sobre Archivos en C

Iniciado por theluigy13etv, 30 Junio 2011, 06:18 AM

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

theluigy13etv

Respecto al modo de apertura de archivos en C tengo la siguiente duda:

Cuando abro un archivo con la instruccion: fopen("Empleados.txt","a+"), e leido que el modo de lectura a+ permite la lectura/escritura/añadidura.... Osea que si realizo la lectura, se realiza desde el inicio...y si seguidameente realizo la escritura lo hace al final??..osea ¿que el puntero del archivo se mueve del inicio y hace un salto al final??...y si vuelvo a leer...el puntero regresa al inicio??...o lee desde donde se quedo, osea desde el final???... :s  :( :( >:( Esto me marea...porfas alguien que me ayude...


Necesito aclarar esta duda urgente porque tengo un trabajo en donde necesito crear y llenar un archivo con un conjunto de numeros de tal manera que no se repita ninguno de ellos...por eso cada vez que ingreso un numero...debo leer el archivo desde el inicio al final y ver que el numero actual no coincida con ningun numero ingresado anteriormente...y si el numero no concide...recien puedo escribirlo en el archivo...para eso deberia abrir el archivo en modo lectura escritura que me permita añadir nuevos numero que no se repitan...el profe me dijo que lo hago en opcion a+...pero...no me funciona...el codigo es el siguiente...haber si me ayudan...


# include <iostream.h>
# include <conio.h>
# include <stdio.h>
# include <stdlib.h>

struct trabajador
{
   int cod;
};

int main()
{
   FILE *ftrabajador;
   struct trabajador f1;
   int codigo;
   char resp;


   do{
      clrscr();
      ftrabajador=fopen("Emplados.DAT","a+b");
      if(ftrabajador==NULL)
      {
         gotoxy(5,7); cout<<"Archivo no existe, sera creado";
         ftrabajador=fopen("Empleados.DAT","a+b");
      }

      gotoxy(5,5); cout<<"CODIGOS ";
      gotoxy(5,8); cout<<"Codi:"; cin>>codigo;
      fread(&f1,sizeof(f1),1,ftrabajador);
      while(!feof(ftrabajador))
      {
         if(codigo==f1.cod)
         {
            gotoxy(5,9); textcolor(LIGHTRED); cprintf("Ya esta registrado"); getche();
            return 0;
         }
         fread(&f1,sizeof(f1),1,ftrabajador);
      }
      f1.cod=codigo;
      fwrite(&f1,sizeof(f1),1,ftrabajador);
      fclose(ftrabajador);
      gotoxy(5,20); cout<<"Otra bez? "; cin>>resp;

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

   return 0;
}


Compilador: Borland C++ 5.02

leogtz

Puedes regresar el cursor al inicio con la función rewind(pf).

http://www.cplusplus.com/reference/clibrary/cstdio/rewind/

Por cierto, tu código tiene más de C que de C++ y no deberías mezclarlos.

Cambia la línea de iostream.h por
#include <iostream>
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

PiroskY

Te doy unos consejos:
No confíes en donde debería estar el puntero

Si solo vas a leer información, abrí como rb
si vas a necesitar escribir, abrí como rb+

si queres leer desde el principio
fseek(puntero,0,seek_set)

si queres agregar algo
fseek(puntero,0,seek_end)

Por ultimo, yo me iría acostumbrando a la programación estructurada (no usar goto)

Btw: se escribe "vez"

Akai

Cita de: PiroskY en 30 Junio 2011, 10:34 AM

si vas a necesitar escribir, abrí como rb+


r+b pondría yo, El global a ti te puede parecer el mismo, a algunos compiladores NO (visual C++ entre otros)