[Powered by Google Translate] TOMMY: Σε αυτό το βίντεο, θα μάθετε για
αναπροσανατολισμό και σωλήνες.
Μέχρι στιγμής, έχουμε χρησιμοποιώντας λειτουργίες όπως η printf να
δεδομένα εξόδου στο τερματικό και λειτουργίες όπως GetString
να επιτρέπουν στο χρήστη να συνεισφέρουν μας
πρόγραμμα χρησιμοποιώντας το πληκτρολόγιο.
Ας ρίξουμε μια ματιά γρήγορα σε ένα πρόγραμμα που παίρνει μια γραμμή του
είσοδο από τον χρήστη και στη συνέχεια να εξάγει.
>> On line 7, είμαστε προτρέποντας τον χρήστη για μια σειρά, και
στη συνέχεια, στη γραμμή 8, είμαστε το πίσω από την εκτύπωση.
Ας μεταγλώττιση και εκτέλεση του προγράμματος μας.
Μεγάλη.
Η σειρά που παρέχεται αυτή επαναλήφθηκε πίσω
μας στο τερματικό.
Αυτό συνέβη επειδή η printf λειτουργία έγραψε σε ένα
ρεύμα που ονομάζεται πρότυπο έξω, ή s-t-d-out.
Όταν κάτι γράφεται στην κανονική έξοδο, είναι από προεπιλογή
εμφανίζεται από το τερματικό.
>> Έτσι, αυτό είναι όλα ωραία και καλά, αλλά τι θα γινόταν αν, αντί απλώς να
εμφανίζει τη συμβολοσειρά, θέλαμε να το αποθηκεύσετε σε ένα αρχείο;
Για παράδειγμα, θα μπορούσαμε να θέλουμε να θυμόμαστε ακριβώς τι μας
πρόγραμμα έκανε όταν δώσαμε μια ιδιαίτερη είσοδο αργότερα.
Μια προσέγγιση θα ήταν να το κάνετε αυτό στο Γ πρόγραμμα μας, με τη χρήση
κάποιες ειδικές λειτουργίες για το γράψιμο σε αρχεία που θα
δείτε σε ένα άλλο βίντεο.
Ακόμα πιο εύκολο, όμως, θα είναι με κάποιο τρόπο να
ανακατεύθυνσης stdout σε ένα αρχείο.
Με αυτόν τον τρόπο, όταν printf γράφει στο stdout, και τα περιεχόμενα θα
να καταγράφονται σε ένα αρχείο και όχι
εμφανίζεται από το τερματικό.
Μπορούμε να κάνουμε ακριβώς ότι με την προσθήκη μια μεγαλύτερη-από το σύμβολο, ακολουθούμενο
από το όνομα του αρχείου, με την εντολή που χρησιμοποιούμε για να εκτελέσει το πρόγραμμά μας.
>> Έτσι, όχι απλώς την εκτέλεση. / Redirect, μπορούμε να
τρέξει. / ανακατεύθυνσης, ακολουθούμενη από μία μεγαλύτερη από σύμβολο, ακολουθούμενο από
αρχείου, όπως file.txt.
Ας δούμε τι θα συμβεί.
OK.
Σημειώστε ότι αυτή τη φορά, τίποτα δεν εμφανίζεται στο τερματικό,
αλλά δεν έχουμε τροποποιήσει τα περιεχόμενα του μας
C πρόγραμμα καθόλου.
Ας εξετάσουμε τώρα τα περιεχόμενα αυτού του καταλόγου με ls.
>> Εντάξει.
Έχουμε τώρα ένα νέο αρχείο στον κατάλογο μας ονομάζεται file.txt,
το οποίο είναι το όνομα του αρχείου που παρέχονται όταν τρέξαμε μας
Ανακατεύθυνση πρόγραμμα.
Ας ανοίξει file.txt.
Και εδώ, μπορούμε να δούμε ότι η stdout από ανακατευθύνει ήταν
γράφονται στο αρχείο που ονομάζεται file.txt.
Ας τρέξει την προηγούμενη εντολή και πάλι, αλλά παρέχει μια
διαφορετικές εισόδου αυτή τη φορά.
Εντάξει.
Ας ρίξουμε μια ματιά σε file.txt τώρα.
>> Μπορούμε να δούμε εδώ ότι το αρχείο έχει αντικατασταθεί, έτσι μας
αρχικής εισόδου δεν είναι πια εκεί.
Αν αντί θέλετε να προσθέσετε σε αυτό το αρχείο, βάζοντας το νέο
εισόδου κάτω από τα υπάρχοντα περιεχόμενα του αρχείου, μπορούμε να
χρησιμοποιήσετε δύο μεγαλύτερες-από σημάδια και όχι μόνο ένα.
Ας το δοκιμάσουμε.
Τώρα, αν ανοίξουμε file.txt πάλι, μπορούμε να δούμε και τα δύο μας
γραμμές εισόδου.
Σε ορισμένες περιπτώσεις, μπορεί να θέλετε να απορρίψετε κάθε
έξοδος του προγράμματός μας.
Αντί γραπτώς την έξοδο σε ένα αρχείο και στη συνέχεια διαγραφή
το αρχείο όταν τελειώσετε με αυτό, μπορούμε να γράψουμε ένα σε ειδικές
αρχείο με όνομα / dev / null.
Όταν κάτι είναι γραμμένο σε / dev/null--
ή απλά devnull για σύντομο -
αυτομάτως απορρίπτεται.
Έτσι σκέφτονται devnull ως μια μαύρη τρύπα για τα δεδομένα σας.
>> Μέχρι τώρα έχουμε δει πως η μεγαλύτερη από ό, τι σημάδι μπορεί να ανακατευθύνει
stdout, ας δούμε πώς μπορούμε να ανακατευθύνει στο πρότυπο -
ή s-τ-ά-σε -
το ανάλογο stdout.
Ενώ λειτουργίες όπως printf γράφουν στο ρεύμα που ονομάζεται
stdout, GetString και παρόμοιες λειτουργίες ανάγνωσης από το ρεύμα
που ονομάζεται stdin, η οποία, εξ ορισμού, είναι το ρεύμα της
χαρακτήρες πληκτρολογούνται στο πληκτρολόγιο.
Μπορούμε να ανακατευθύνει stdin χρησιμοποιώντας το μικρότερο σημάδι, ακολουθούμενη
από ένα όνομα αρχείου.
Τώρα, αντί να ζητά από το χρήστη για την είσοδο σε ο
τερματικό, ένα πρόγραμμα θα ανοίξει το αρχείο που καθορίζεται και χρήση
γραμμές του σαν είσοδο.
>> Ας δούμε τι θα συμβεί.
Μεγάλη.
Η πρώτη γραμμή του file.txt έχει τυπωθεί στο τερματικό
επειδή είμαστε καλώντας GetString φορά.
Αν είχαμε μια άλλη κλήση σε GetString στο πρόγραμμά μας, το
επόμενη γραμμή file.txt θα είχαν χρησιμοποιηθεί ως
εισόδου στην εν λόγω πρόσκληση.
Και πάλι, δεν έχουμε τροποποιημένο πρόγραμμα C μας σε όλα.
Είμαστε μόνο αλλάζουν τον τρόπο να τρέξει.
Και να θυμάστε, επίσης, δεν έχουμε ανακατεύθυνση stdout αυτή τη φορά,
έτσι ώστε η έξοδος του προγράμματος ήταν ακόμη
εμφανίζεται στο τερματικό.
Μπορούμε, βέβαια, να κατευθύνει τόσο stdin
και stdout σαν αυτό.
Τώρα, file2.txt περιέχει την πρώτη γραμμή του file.txt.
>> Έτσι, με τη χρήση αυτών των φορέων, είμαστε σε θέση να διαβάζουν και να
γράψετε από αρχεία κειμένου.
Τώρα, ας δούμε πώς μπορούμε να χρησιμοποιήσουμε την έξοδο ενός προγράμματος, όπως
η είσοδος σε ένα άλλο πρόγραμμα.
Έτσι, εδώ είναι ένα άλλο απλό πρόγραμμα Γ Ι
έχουν ζητήσει εδώ hello.c.
Όπως μπορείτε να δείτε, αυτό εξάγει απλά "Γεια
εκεί! "στο χρήστη.
Αν θέλω να ανακατευθύνει χρησιμοποιούν ως είσοδο την έξοδο του γειά σου -
ένα άλλο πρόγραμμα -
Θα μπορούσα να ανακατευθύνει πρώτα το stdout του γειά σου σε ένα αρχείο που ονομάζεται
input.txt, ανακατευθύνει στη συνέχεια το stdin της ανακατευθύνει στην ίδια
αρχείο - INPUT.TXT.
Έτσι, μπορώ να κάνω. / Γεια> INPUT.TXT.
Πατήστε το πλήκτρο Enter για να εκτελέσει αυτό.
Ακολούθησε. / Redirect <
INPUT.TXT, ότι και να εκτελέσει.
Έτσι, μπορούμε να συντομεύσουμε αυτό το λίγο με ένα ερωτηματικό, το οποίο επιτρέπει
μας να τρέξει δύο ή περισσότερες εντολές στην ίδια γραμμή.
Έτσι, μπορώ να πω,. / Γειά σου> input.txt, ερωτηματικό,
. / Redirect <INPUT.TXT.
>> Έτσι, αυτή η εργασία, αλλά εξακολουθεί να αισθάνεται αρκετά άκομψο.
Θέλω να πω, δεν χρειαζόμαστε πραγματικά αυτό το αρχείο κειμένου που είναι ενδιάμεσο
δεν είναι πλέον αναγκαία αφού ανακατευθύνει τρεξίματα;
Ευτυχώς, μπορούμε να αποφύγουμε αυτό το επιπλέον αρχείο κειμένου χρησιμοποιώντας ό, τι είναι
ονομάζεται ένας σωλήνας.
Αν λέω, / γεια |.. / Ανακατεύθυνση, τότε το stdout της
το πρόγραμμα για την αριστερά -
σε αυτή την περίπτωση, γειά σου -
θα χρησιμοποιηθεί ως πρότυπο για την είσοδο
πρόγραμμα στα δεξιά.
Σε αυτή την περίπτωση, ανακατευθύνει. Ας τρέξει αυτό.
>> Εκεί πάμε.
Μπορούμε να δούμε ότι η έξοδος της γεια χρησιμοποιήθηκε ως είσοδος
για ανακατεύθυνση.
Με stringing εντολές μεταξύ τους χρησιμοποιώντας σωλήνες, που σχηματίζουν ό, τι είναι
ονομάζεται αγωγός, δεδομένου ότι η παραγωγή μας είναι ουσιαστικά κινείται
μέσα από μια σειρά εντολών.
Χρησιμοποιώντας σωλήνες, μπορούμε να κάνουμε κάποια δροσερή ουσία χωρίς να χρειάζεται να
γράψετε οποιοδήποτε κώδικα καθόλου.
Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να γνωρίζουμε πόσα είναι τα αρχεία
μέσα από αυτόν τον κατάλογο.
Χρησιμοποιώντας ένα σωλήνα, μπορούμε να συνδυάσουμε την εντολή ls με το wc -
ή wordcount -
εντολή.
Ls θα εμφανίσει κάθε αρχείο στον κατάλογο στο stdout, και
wc θα μας πει πόσες γραμμές δόθηκαν σε αυτό μέσω stdin.
Έτσι, αν πούμε ls | wc-l -
την παροχή των-l σημαία να wc να το πω για να μετρήσει τις γραμμές -
μπορούμε να δούμε ακριβώς πόσα αρχεία είναι
στον τρέχοντα κατάλογο.
>> Έτσι, ας ρίξουμε μια ματιά σε ένα ακόμη παράδειγμα.
Έχω εδώ ένα αρχείο που ονομάζεται students.txt,
με μια λίστα ονομάτων.
Ωστόσο, οι ονομασίες αυτές δεν είναι σε οποιαδήποτε σειρά όλα, και φαίνεται
όπως επαναλαμβάνονται μερικά ονόματα.
Αυτό που θέλουμε είναι μια λίστα με μοναδικά ονόματα σε αλφαβητική
Προκειμένου, αποθηκεύονται σε ένα αρχείο με όνομα final.txt.
Θα μπορούσαμε, βέβαια, να γράψετε ένα πρόγραμμα C για να το κάνετε αυτό για εμάς.
Αλλά αυτό πρόκειται να πάρει άσκοπα
πολύπλοκη αρκετά γρήγορα.
Ας χρησιμοποιήσουμε αντί για σωλήνες και κάποια built-in-εργαλεία για την επίλυση
αυτό το πρόβλημα.
>> Το πρώτο πράγμα που πρέπει να κάνετε είναι να διαβάσετε το αρχείο students.txt.
Η εντολή cat θα κάνουν ακριβώς αυτό.
Θα διαβάσετε το καθορισμένο αρχείο και να γράφουν
το περιεχόμενό του στο stdout.
Αφού έχετε διαβάσει το αρχείο κειμένου, θα
θέλετε να ταξινομήσετε τα ονόματα.
Η εντολή ταξινόμησης μπορεί να χειριστεί αυτό για εμάς.
Ταξινόμηση θα εμφανίσει τη γραμμή που παρέχονται μέσω stdin στο stdout
σε ταξινομημένη σειρά.
Με σκοπό την παροχή των περιεχομένων του σε students.txt
stdin είδος του, θα μπορούσαμε να χρησιμοποιήσουμε ένα σωλήνα για να συνδυάσει τη γάτα και το είδος.
Γι 'αυτό και μπορεί να εκτελέσει γάτα students.txt | είδος και
πατήστε το πλήκτρο Enter.
Και τώρα, βλέπουμε τα περιεχόμενα του σε students.txt
αλφαβητική σειρά.
>> Έτσι, ας προσθέσουμε άλλη εντολή -
uniq, ή μοναδική -
σε αγωγό μας.
Όπως μπορείτε να μαντέψετε, uniq, όταν παρέχεται μια ταξινομημένη ακολουθία του
γραμμές μέσω stdin, θα εμφανίσει τις μοναδικές γραμμές.
Έτσι τώρα έχουμε students.txt γάτα
| Sort | uniq.
Τέλος, μπορούμε να σώσουμε την έξοδο του αγωγού σε ένα
αρχείο μέσω γάτα students.txt | sort | uniq
> Final.txt.
Έτσι, αν έχουμε ανοίξει final.txt, έχουμε ακριβώς αυτό που ήταν
ψάχνουν για:
μια λίστα με μοναδικά ονόματα σε αλφαβητική σειρά,
αποθηκεύονται σε ένα αρχείο κειμένου.
Με τον τρόπο αυτό, θα μπορούσε επίσης να πει είδος <
students.txt | uniq> final.txt να κάνει ακριβώς
το ίδιο πράγμα, με κάθε μία από τις επιχειρήσεις που έχουμε δει σε
αυτό το βίντεο.
>> Το όνομά μου είναι ο Tommy, και αυτό είναι CS50.