Δημοσιεύτηκε: 09 Ιούλ 2011, 04:38
από migf1
Παράδειγμα καταχώρησης 3 εγγραφών σε αρχείο, και κατόπιν αλλαγή της 3ης και της 1ης.

Κώδικας: Επιλογή όλων

/* -------------------------------------------------------------
* Από: migf1
* Παράδειγμα καταχώρησης 3 εγγραφών σε αρχείο, και κατόπιν αλλαγή της 3ης και της 1ης
* -------------------------------------------------------------
*/

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

#define MAXLEN_ID (3+1) // μέγιστο μήκος κωδικού
#define MAXLEN_NAME (25+1) // μέγιστο μήκος ονόματος

#define myexit(n) printf("\npress ENTER to exit..."); fflush(stdin); getchar(); exit((n))

typedef enum { FALSE=0, TRUE } bool;

typedef struct rec { // δομή εγγραφής
char id[ MAXLEN_ID ]; // κωδικός
char name[ MAXLEN_NAME ]; // όνομα
} Rec;


// ------------------------------------------------------------------------------------
// Αντιγραφή του string: src στο string: dst (έως n-1 χαρακτήρες)
//
char *s_ncopy( char *dst, const char *src, int n )
{
char *save = dst;

while ( (dst-save) < n-1 && (*dst=*src) != '\0' )
dst++, src++;

if ( *dst )
*dst = 0;

return save;
}

// ------------------------------------------------------------------------------------
// Δημιουργία της εγγραφής: rec στην μνήμη, με κωδικό: id και όνομα: name
//
Rec *rec_set( Rec *rec, const char *id, const char *name )
{
if ( !rec )
return NULL;

s_ncopy( rec->id, id, MAXLEN_ID );
s_ncopy( rec->name, name, MAXLEN_NAME );

return rec;
}

// ------------------------------------------------------------------------------------
// Ανάγνωση της εγγραφής: rec που βρίσκεται στη θέση: fpos του αρχείου: fp
//
bool rec_fread( FILE *fp, const int fpos, Rec *rec )
{
if ( !fp )
return FALSE;

if ( fseek( fp, (fpos-1) * sizeof(Rec), SEEK_SET ) != 0 )
return FALSE;

if ( fread( rec, sizeof(Rec), 1, fp ) != 1 )
return FALSE;

return TRUE;
}

// ------------------------------------------------------------------------------------
// Καταχώρηση της εγγραφής: newrec στη θέση: fpos του αρχειου: fp
//
bool rec_fwrite( FILE *fp, const int fpos, const Rec *newrec )
{
if ( !fp )
return FALSE;

if ( fseek( fp, (fpos-1) * sizeof(Rec), SEEK_SET ) != 0 )
return FALSE;

if ( fwrite( newrec, sizeof(Rec), 1, fp ) != 1 )
return FALSE;

return TRUE;
}

// ------------------------------------------------------------------------------------
// Ανάγνωση και τύπωμα όλων των εγγραφών του αρχείου: fp
//
bool f_print( FILE *fp )
{
if ( !fp )
return FALSE;

if ( fseek( fp, 0, SEEK_SET ) != 0 ) // μεταπήδηση στην αρχή του αρχείου
return FALSE;

Rec rec; // προσωρινή εγγραφή

puts("File Contents\n-------------");
while ( fread( &rec, sizeof(Rec), 1, fp ) )
printf( "%s %s\n", rec.id, rec.name );

putchar('\n');

return TRUE;
}

// ------------------------------------------------------------------------------------
int main( void )
{
char fname[] = "b.txt"; // το όνομα του αρχείου
Rec rec = { .id="", .name="" }; // προσωρινή δομή εγγραφής

FILE *fp = fopen( fname, "w+" ); // άνοιγμα του αρχείου
if ( !fp ) { // αποτυχία
puts("*** fatal error: fopen() failed"); // προώρος τερματισμός
myexit(1);
}

/* αποθήκευση 3 εγγραφών (χωρίς έλεγχο για σφάλματα) */

rec_set( &rec, "001", "Giorgos" ); // αποθήκευση 1ης εγγραφής
rec_fwrite( fp, 1, &rec );

rec_set( &rec, "002", "Xristos" ); // αποθήκευση 2ης εγγραφής
rec_fwrite( fp, 2, &rec );

rec_set( &rec, "003", "Petros" ); // αποθήκευση 3ης εγγραφής
rec_fwrite( fp, 3, &rec );

f_print( fp ); // εμφάνιση περιεχομένων αρχείου

/* αλλαγή εγγραφών 3 και 1 (με έλεγχο για σφάλματα) */

rec_set( &rec, "003", "Basilhs" ); // ΑΛΛΑΓΗ 3ης εγγραφής
if ( !rec_fwrite( fp, 3, &rec ) )
puts("\t*** error: write file error");

rec_set( &rec, "001", "Maria" ); // ΑΛΛΑΓΗ 1ης εγγραφής
if ( !rec_fwrite( fp, 1, &rec ) )
puts("\t*** error: write file error");

if ( !f_print( fp ) ) // εμφάνιση περιεχομένων αρχείου
puts("\t*** error: read file error");

fclose( fp ); // κλείσιμο του αρχείου
myexit(0); // τερματισμός του προγράμματος
}