Προς το περιεχόμενο

Απορία στην C (διάβασμα αρχείου)


mtzoumas

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

 

Υπάρχει τρόπος στην C να ανοίγω ένα αρχείο και από αυτό να διαβάζω κάποια συγκεκριμμένη γραμμή ακόμα και την τελευταία μόνο και να αγνοώ τις υπόλοιπες;

 

Ευχαριστώ.

Δημοσ.

Καταρχάς έστω οτι έχεις κάποιο αρχείο με όνομα random.txt στο ίδιο directory με αυτό που θα αποθηκεύσεις το πρόγραμμα σου.

 

Προσπερνώντας τα include που πρέπει να κάνεις ας πάμε κατευθείαν στο ζουμί και θα επανέλθουμε αργότερα σε αυτά.

 

Το πρώτο που πρέπει να κανεις είναι να δημιουργήσεις έναν δείκτη FILE , το όνομα του δεν έχει σημασία βάζεις ότι θέλεις. Το τί κάνει το FILE μπορείς να το γκουγκλάρεις αλλά δεν είναι απαραίτητο να ξέρεις πως δουλεύει , απλά οτι το χρειάζεσαι για να γράψεις και να διαβάσεις απο αρχεία. Οπότε:

 

FILE *fp;

 

Τώρα πριν γράψουμε κώδικα για αυτό που ακριβώς θέλεις να κάνεις πρέπει απλά να θυμάσαι οτι αυτά που μπορούμε να κάνουμε με το αρχείο έχουν μια μικρή διαδικασία.

 

1) Ανοίγω το αρχείο

2)Κάνω την δουλειά μου σε αυτό με το κώδικα μου

3) Κλείνω το αρχείο.

 

Πάμε λοιπόν να ανοίξουμε το αρχείο σου. Αυτό θα γίνει με την εντολή fopen που θα πάρει ώς όρισμα το όνομα του αρχείου σου και τον σκοπό που θέλεις το αρχείο. Αυτό όλο το αναθέτεις στον δείκτη FILE σου.

 

fp = fopen(filename, mode);

 

filename = random.txt στην περίπτωση μας.

mode= είτε "r" είτε "w" είτε και τα 2 με "rw".

 

Oπότε η εντολή σου θα έχει ώς εξής:

 

fp = fopen("random.txt", "r"); //αφού θέλεις μόνο ανάγνωση

 

Οπότε αυτην την στιγμή αν το αρχείο random.txt υπάρχει μόλις το άνοιξες για να το δουλέψεις. Τώρα όμως εσύ θέλεις να δουλέψεις σε αυτό για αυτό και θα χρειαστείς κάποια εντολή για να διαβάζεις τις γραμμές απο αυτό.Η εντολή αυτή είναι η fgets() .

 

Eνα τυπικό παράδειγμα της fgets είναι πχ αυτό fgets(c, 10, file)

Το πρώτο όρισμα είναι ενας πίνακας char που πρέπει να δημιουργήσεις , το δεύτερο το μέγεθος του πίνακα και το τρίτο ο δείκτης file σου.

 

Αρα:

 

char c[100]; //ειπαμε 100= το μεγεθος σε χαρακτηρες της σειρας που θα διαβασει

fgets(c, 100, fp);

 

Όμως θέλεις να διαβάσει συγκεκριμένη γραμμή άρα

int choice = 5; //εδώ βάλε τον αριθμό της γραμμής που θέλεις να διαβάσει

int counter=0;

while(fgets(c, 100, fp)!=NULL) {

 

/* keep looping μέχρι να φτάσεις το choice */

if (counter==choice)

{

printf("String: %s", c);

}

 

/* print the file one line at a time */

counter++;

}

 

 

Όλος ο κώδικας .

 

>#include <stdio.h>   /* required for file operations */
#include <dos.h>  /* for delay */

FILE *fr;            /* declare the file pointer */

main()

{

  char c[80];
 

  fr = fopen ("random.txt", "r");  /* open the file for reading */

  /* "r" means open the file for reading text */
int counter=0;
int choice=2;
  while(fgets(c, 80, fr) != NULL)
  {
/* keep looping ìÝ÷ñé íá öôÜóåéò ôï choice */
     if (counter==choice){
printf("String: %s", c);}
     counter++;
  }
  fclose(fr);  /* close the file prior to exiting the routine */
} 

Δημοσ.

Φίλε ευχαριστώ για τον κώδικα σου.

Μετά από αρκετό ψάξιμο είδα μια συνάρτηση την fseek η οποία αλλάζει την θέση

ανάγνωσης. Δεν θα ήταν γρηγορότερο να χρησιμοποιώ την fseek με δεδομένο ότι έχω σταθερό μέγεθος χαρακτήρων ανά γραμμή?

 

π.χ.

x = 5; //θέλω να διαβάσω την 5η γραμμή

y = 9; //9 χαρακήρες ανά γραμμή

position = (x-1)*(y+1);

fseek(fp,position,SEEK_SET) ;

Δημοσ.

εννοείται οτι πρέπει να χρησιμοποιησεις την fseek (και lseek εφοσον παίζεις με file descriptors -σε POSIX.1 compliant συστήματα δλδ-)

Δημοσ.

ενώ λειτουργεί μια χαρά η fseek όταν διαβάζω με fscanf μια μεταβλητή float

η fscanf δεν διαβάζει σωστά το νούμερο ενώ αν αντί για float βάλω char τότε τη

διαβάζει σωστά αλλά δυστυχώς είναι κείμενο.

 

π.χ.

ενώ στο αρχείο υπάρχει αυτό: 67.633671

με την fscanf διαβάζω αυτό: 67.633675

 

 

πώς γίνεται αυτό?

Δημοσ.

Ναι με fseek ακόμη καλύτερα.

 

 

Μήπως πρέπει να κάνεις cast τον char σε float για να πάρεις το σωστό νούμερο? Δοκίμασε το και πές μας.

Δημοσ.

πώς κάνουμε cast σε float όμως?

 

 

-----Προστέθηκε 4/1/2009 στις 07 : 57 : 23-----

 

 

τελικά το πρόβλημα ήταν πολύ άκυρο. για κάποιο λόγο διάβαζε σώστα μερικές γραμμές και όχι όλες. τελικά διόρθωσα το πρόβλημα αλλάζοντας τον float σε double.

ευχαριστώ για την βοήθεια.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...