freopen vs ifstream & ofstream

Ο Διάλογος που καταλήγει Διαμάχη. Απόψεις, κόντρες και Διαξιφισμοί για θέματα πληροφορικής και τεχνολογίας, εδώ!
Απάντηση
nikoskon
Δημοσιεύσεις: 10
Εγγραφή: Τρί Φεβ 18, 2020 6:13 pm

freopen vs ifstream & ofstream

Δημοσίευση από nikoskon »

Για σας!
Αναρωτιόμουν ποιό είναι καλύτερο σε χρόνο για ανάγνωση αρχείων απο:

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

freopen("x.y", "r", stdin);
cin>>var;
και:

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

ifstream file("x.y");
file>>var;
file.close();
και για το γράψιμο σε αρχεία, ποιό απο:

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

freopen("x.y", "w", stdout);
cout<<val;
και:

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

ofstream file("x.y")
file<<val;
file.close();
Ευχαριστώ πολύ!
Άβαταρ μέλους
Κηπουρίδης
Δημοσιεύσεις: 397
Εγγραφή: Παρ Φεβ 05, 2010 5:05 pm

Re: freopen vs ifstream & ofstream

Δημοσίευση από Κηπουρίδης »

Η σύντομη απάντησή μου είναι ότι ο διαγωνισμός φροντίζει να μην ασχολείται με τέτοιες λεπτομέρειες, ό,τι και να χρησιμοποιήσεις θα είναι εντός χρονικών ορίων πολύυυυ άνετα. Προσωπικά έγραφα πάντα με freopen και scanf/printf και δεν υπήρξε ποτέ πρόβλημα.
Ελπίζω ότι εντός διημέρου θα μπορέσω να γράψω μια πιο πλήρη απάντηση γιατί η ερώτηση είναι πάρα πάρα πολύ ενδιαφέρουσα.
Καλώς όρισες στο forum.
Λύσεις θεμάτων ΠΔΠ: https://pdp-archive.github.io/
Μπούσουλας διαβάσματος ΠΔΠ: http://snf-800715.vm.okeanos.grnet.gr/PDP/
Tutorials: https://kallinikos.github.io/
Επίσημο forum ΠΔΠ: https://www.pdpforum.eu.org/forum/
Άβαταρ μέλους
Κηπουρίδης
Δημοσιεύσεις: 397
Εγγραφή: Παρ Φεβ 05, 2010 5:05 pm

Re: freopen vs ifstream & ofstream

Δημοσίευση από Κηπουρίδης »

Χίλια συγγνώμη που άργησα τόσο να απαντήσω. Η ερώτησή σου επιδέχεται πολλές απαντήσεις, ανάλογα με το στόχο τον οποίο έχεις θέσει.

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

A) Ταχύτητα.
- Η freopen έχει αμελητέα διαφορά στην ταχύτητα, όχι μόνο για τα πλαίσια του διαγωνισμού, αλλά γενικά. Οπότε χρησιμοποίησέ την άφοβα αν σε βολεύει.
- Οι scanf/printf είναι αισθητά ταχύτερες από τις cin/cout, ίσως μέχρι και πέντε φορές ταχύτερες. Παρόλα αυτά αν χρησιμοποιήσεις την εντολή sync_with_stdio(false), τότε είναι ίδιας ταχύτητας.
- Το ταχύτερο που μπορείς να χρησιμοποιήσεις, είναι να γράψεις μία δικιά σου συνάρτηση που διαβάζει ένα ένα τους χαρακτήρες και συνθέτει τον ακέραιο. Το σκεπτικό, στο περίπου, είναι ότι διαβάζεις ένα ψηφίο, μετά πολλαπλασιάζεις με δέκα, διαβάζεις το επόμενο και το προσθέτεις, και ξανά και ξανά... κάπως έτσι:

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

#define gc getchar_unlocked
int read_int() {
  char c = gc();
  while(c<'0' || c>'9') c = gc();
  int ret = 0;
  while(c>='0' && c<='9') {
    ret = 10 * ret + c - 48;
    c = gc();
  }
  return ret;
}
Με αντίστοιχη λογική, χρησιμοποιώντας την εντολή putchar_unlocked() αντί για getchar_unlocked(), μπορείς να τυπώσεις γρήγορα.

Σημειώσεις περί ταχύτητας: Στους σοβαρούς διαγωνισμούς δεν παίζει ποτέ τόσο ρόλο το διάβασμα, οπότε μη χρησιμοποιείς την δική σου συνάρτηση. Χρησιμοποίησε όποια από τις scanf/cin προτιμάς, και αν σε βολεύει βάλε και freopen. Στον πραγματικό κόσμο, και πάλι θα χρησιμοποιείς έτοιμες συναρτήσεις. Μπορεί να μην είναι οι scanf/cin, αλλά κάποια ειδικά διαμορφωμένη από την εταιρεία για την οποία δουλεύεις, αλλά γενικά δεν αξίζει τον κόπο το τόσο παλαβό I/O.

Β) Καθαρότητα κώδικα
Ίσως λίγο πιο καθαρό το cin/cout, αλλά επίσης δε δίνει τόσο απλά τη δυνατότητα να κάνεις τη μορφοποίηση όπως θέλεις. Επιπλέον για να πετύχεις ίδια ταχύτητα πρέπει να θυμηθείς την εντολή με το sync_with_stdio(false) που έγραψα παραπάνω. Εγώ προτιμώ scanf/printf. Σίγουρα η δική μας συνάρτηση είναι η πιο δυσανάγνωστη, και πιθανώς να έχει και bugs!

Γ) Επεκτασιμότητα
Η cin/cout μπορεί να προσαρμοστεί ώστε να διαβάζει/τυπώνει πιο σύνθετες structs. Σίγουρα αυτό δε θα το χρειαστείς σε διαγωνισμό, όμως σε πραγματική δουλειά ίσως είναι χρήσιμο.

Δ) Να αλλάξω μέθοδο;
Όχι, παρά μόνο αν ο ίδιος νιώθεις ότι κάπου σε περιορίζει. Είναι απείρως σημαντικότερο, τόσο στο διαγωνισμό όσο και σε εταιρείες, να νιώθεις άνετα με αυτό που χρησιμοποιείς, καθώς αυτό ελαχιστοποιεί την πιθανότητα σφαλμάτων. Πίστεψέ με, είναι δραματικά σημαντικότερη η έλλειψη σφαλμάτων από το να κερδίσεις κάτι ψιλά σε ταχύτητα.

Ελπίζω να απάντησα σε ό,τι σε απασχολούσε, αν έχεις κάποια άλλη απορία, ενημέρωσε.
Λύσεις θεμάτων ΠΔΠ: https://pdp-archive.github.io/
Μπούσουλας διαβάσματος ΠΔΠ: http://snf-800715.vm.okeanos.grnet.gr/PDP/
Tutorials: https://kallinikos.github.io/
Επίσημο forum ΠΔΠ: https://www.pdpforum.eu.org/forum/
nikoskon
Δημοσιεύσεις: 10
Εγγραφή: Τρί Φεβ 18, 2020 6:13 pm

Re: freopen vs ifstream & ofstream

Δημοσίευση από nikoskon »

Ευχαριστώ πολύ για την απάντηση!
Οπότε, ουσιατικά δεν υπάρχει μεγάλη διαφορά στην ανάγνωση αρχείων, τουλάχιστον για τους διαγωνισμούς. Συνεπώς είναι καλύτερο για τον καθένα να χρησιμοποιήει ότι τον βολεύει ή έχει μάθει 'καλύτερα'.
Απάντηση