Ilias95 έγραψε: έγραψε: -c, --bytes
print the byte counts
Για να υπολογίσω τα bytes που περιέχει το αρχείο, είναι σωστό το παρακάτω;
- Κώδικας: Επιλογή όλων
num_chars * sizeof(char) \\ όπου num_chars ο αριθμός των χαρακτήρων στο αρχείο
Ναι, σωστό είναι

Ilias95 έγραψε:Επίσης κάτι άλλο.
-
Μορφοποιημένος Κώδικας: Επιλογή όλων
-
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MYFILE "/home/ilias/afile.txt"
bool open_file(FILE *fp, char filename[])
{
return ((fp = fopen(filename, "r")) == NULL) ? false : true;
}
int main(void)
{
FILE *file;
if (! open_file(file, MYFILE)) {
printf("%s can't be opened\n", MYFILE);
exit(EXIT_FAILURE);
}
fclose(file);
exit(EXIT_SUCCESS);
}
Το παραπάνω θα δώσει seg fault.
Αυτό συμβαίνει γιατί αν και η open_file() δουλεύει σωστά και επιστρέφει αν το αρχείο ανοίγει κανονικά ή όχι, τελικά ο pointer file στην main δεν δείχνει στο αρχείο που άνοιξε η fopen().
Πως μπορώ να διορθώσω το παραπάνω;
Για αρχή πρέπει να κάνεις συνήθεια να αρχικοποιείς σε NULL
όλους τους δείκτες που δεν χρησιμοποιείς άμεσα (στο συγκεκριμένο παράδειγμα τον
file).
Το βασικό πρόβλημα είναι αλλού όμως, είναι πως ο δείκτης
file περνιέται by-value στην open_file() με αποτέλεσμα στη συνέχεια, στο fclose(file) να μην περιέχει την τιμή που του ανατέθηκε μέσα στην open_file().
Για να το διορθώσεις, ή θα πρέπει να περάσεις τον file by-reference στην open_file, δηλαδή &fp (με τις κατάλληλες αλλαγές στο πρότυπο και στο σώμα της) ή να κάνεις τον έλεγχο για το άνοιγμα του αρχείου απευθείας στη main, χωρίς μεσολάβηση δηλαδή συνάρτησης.