1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] TOMMY: Σε αυτό το βίντεο, θα μάθετε για 2 00:00:08,420 --> 00:00:10,140 αναπροσανατολισμό και σωλήνες. 3 00:00:10,140 --> 00:00:12,780 Μέχρι στιγμής, έχουμε χρησιμοποιώντας λειτουργίες όπως η printf να 4 00:00:12,780 --> 00:00:15,590 δεδομένα εξόδου στο τερματικό και λειτουργίες όπως GetString 5 00:00:15,590 --> 00:00:17,520 να επιτρέπουν στο χρήστη να συνεισφέρουν μας 6 00:00:17,520 --> 00:00:19,490 πρόγραμμα χρησιμοποιώντας το πληκτρολόγιο. 7 00:00:19,490 --> 00:00:21,880 Ας ρίξουμε μια ματιά γρήγορα σε ένα πρόγραμμα που παίρνει μια γραμμή του 8 00:00:21,880 --> 00:00:25,960 είσοδο από τον χρήστη και στη συνέχεια να εξάγει. 9 00:00:25,960 --> 00:00:28,990 >> On line 7, είμαστε προτρέποντας τον χρήστη για μια σειρά, και 10 00:00:28,990 --> 00:00:31,680 στη συνέχεια, στη γραμμή 8, είμαστε το πίσω από την εκτύπωση. 11 00:00:31,680 --> 00:00:35,220 Ας μεταγλώττιση και εκτέλεση του προγράμματος μας. 12 00:00:35,220 --> 00:00:35,900 Μεγάλη. 13 00:00:35,900 --> 00:00:37,620 Η σειρά που παρέχεται αυτή επαναλήφθηκε πίσω 14 00:00:37,620 --> 00:00:39,170 μας στο τερματικό. 15 00:00:39,170 --> 00:00:42,110 Αυτό συνέβη επειδή η printf λειτουργία έγραψε σε ένα 16 00:00:42,110 --> 00:00:46,220 ρεύμα που ονομάζεται πρότυπο έξω, ή s-t-d-out. 17 00:00:46,220 --> 00:00:49,230 Όταν κάτι γράφεται στην κανονική έξοδο, είναι από προεπιλογή 18 00:00:49,230 --> 00:00:51,110 εμφανίζεται από το τερματικό. 19 00:00:51,110 --> 00:00:53,720 >> Έτσι, αυτό είναι όλα ωραία και καλά, αλλά τι θα γινόταν αν, αντί απλώς να 20 00:00:53,720 --> 00:00:57,700 εμφανίζει τη συμβολοσειρά, θέλαμε να το αποθηκεύσετε σε ένα αρχείο; 21 00:00:57,700 --> 00:01:00,470 Για παράδειγμα, θα μπορούσαμε να θέλουμε να θυμόμαστε ακριβώς τι μας 22 00:01:00,470 --> 00:01:04,450 πρόγραμμα έκανε όταν δώσαμε μια ιδιαίτερη είσοδο αργότερα. 23 00:01:04,450 --> 00:01:07,270 Μια προσέγγιση θα ήταν να το κάνετε αυτό στο Γ πρόγραμμα μας, με τη χρήση 24 00:01:07,270 --> 00:01:09,680 κάποιες ειδικές λειτουργίες για το γράψιμο σε αρχεία που θα 25 00:01:09,680 --> 00:01:11,270 δείτε σε ένα άλλο βίντεο. 26 00:01:11,270 --> 00:01:13,260 Ακόμα πιο εύκολο, όμως, θα είναι με κάποιο τρόπο να 27 00:01:13,260 --> 00:01:16,090 ανακατεύθυνσης stdout σε ένα αρχείο. 28 00:01:16,090 --> 00:01:19,780 Με αυτόν τον τρόπο, όταν printf γράφει στο stdout, και τα περιεχόμενα θα 29 00:01:19,780 --> 00:01:21,720 να καταγράφονται σε ένα αρχείο και όχι 30 00:01:21,720 --> 00:01:23,410 εμφανίζεται από το τερματικό. 31 00:01:23,410 --> 00:01:26,690 Μπορούμε να κάνουμε ακριβώς ότι με την προσθήκη μια μεγαλύτερη-από το σύμβολο, ακολουθούμενο 32 00:01:26,690 --> 00:01:30,820 από το όνομα του αρχείου, με την εντολή που χρησιμοποιούμε για να εκτελέσει το πρόγραμμά μας. 33 00:01:30,820 --> 00:01:34,730 >> Έτσι, όχι απλώς την εκτέλεση. / Redirect, μπορούμε να 34 00:01:34,730 --> 00:01:38,880 τρέξει. / ανακατεύθυνσης, ακολουθούμενη από μία μεγαλύτερη από σύμβολο, ακολουθούμενο από 35 00:01:38,880 --> 00:01:41,530 αρχείου, όπως file.txt. 36 00:01:41,530 --> 00:01:44,290 Ας δούμε τι θα συμβεί. 37 00:01:44,290 --> 00:01:45,130 OK. 38 00:01:45,130 --> 00:01:48,470 Σημειώστε ότι αυτή τη φορά, τίποτα δεν εμφανίζεται στο τερματικό, 39 00:01:48,470 --> 00:01:50,290 αλλά δεν έχουμε τροποποιήσει τα περιεχόμενα του μας 40 00:01:50,290 --> 00:01:52,040 C πρόγραμμα καθόλου. 41 00:01:52,040 --> 00:01:56,090 Ας εξετάσουμε τώρα τα περιεχόμενα αυτού του καταλόγου με ls. 42 00:01:56,090 --> 00:01:56,630 >> Εντάξει. 43 00:01:56,630 --> 00:02:00,840 Έχουμε τώρα ένα νέο αρχείο στον κατάλογο μας ονομάζεται file.txt, 44 00:02:00,840 --> 00:02:03,640 το οποίο είναι το όνομα του αρχείου που παρέχονται όταν τρέξαμε μας 45 00:02:03,640 --> 00:02:05,050 Ανακατεύθυνση πρόγραμμα. 46 00:02:05,050 --> 00:02:08,020 Ας ανοίξει file.txt. 47 00:02:08,020 --> 00:02:11,840 Και εδώ, μπορούμε να δούμε ότι η stdout από ανακατευθύνει ήταν 48 00:02:11,840 --> 00:02:15,550 γράφονται στο αρχείο που ονομάζεται file.txt. 49 00:02:15,550 --> 00:02:18,470 Ας τρέξει την προηγούμενη εντολή και πάλι, αλλά παρέχει μια 50 00:02:18,470 --> 00:02:20,075 διαφορετικές εισόδου αυτή τη φορά. 51 00:02:25,140 --> 00:02:25,900 Εντάξει. 52 00:02:25,900 --> 00:02:28,205 Ας ρίξουμε μια ματιά σε file.txt τώρα. 53 00:02:31,070 --> 00:02:34,580 >> Μπορούμε να δούμε εδώ ότι το αρχείο έχει αντικατασταθεί, έτσι μας 54 00:02:34,580 --> 00:02:37,120 αρχικής εισόδου δεν είναι πια εκεί. 55 00:02:37,120 --> 00:02:40,280 Αν αντί θέλετε να προσθέσετε σε αυτό το αρχείο, βάζοντας το νέο 56 00:02:40,280 --> 00:02:43,600 εισόδου κάτω από τα υπάρχοντα περιεχόμενα του αρχείου, μπορούμε να 57 00:02:43,600 --> 00:02:46,800 χρησιμοποιήσετε δύο μεγαλύτερες-από σημάδια και όχι μόνο ένα. 58 00:02:46,800 --> 00:02:48,050 Ας το δοκιμάσουμε. 59 00:02:52,160 --> 00:02:57,910 Τώρα, αν ανοίξουμε file.txt πάλι, μπορούμε να δούμε και τα δύο μας 60 00:02:57,910 --> 00:02:59,580 γραμμές εισόδου. 61 00:02:59,580 --> 00:03:02,180 Σε ορισμένες περιπτώσεις, μπορεί να θέλετε να απορρίψετε κάθε 62 00:03:02,180 --> 00:03:03,850 έξοδος του προγράμματός μας. 63 00:03:03,850 --> 00:03:06,450 Αντί γραπτώς την έξοδο σε ένα αρχείο και στη συνέχεια διαγραφή 64 00:03:06,450 --> 00:03:09,310 το αρχείο όταν τελειώσετε με αυτό, μπορούμε να γράψουμε ένα σε ειδικές 65 00:03:09,310 --> 00:03:12,360 αρχείο με όνομα / dev / null. 66 00:03:12,360 --> 00:03:15,160 Όταν κάτι είναι γραμμένο σε / dev/null-- 67 00:03:15,160 --> 00:03:16,960 ή απλά devnull για σύντομο - 68 00:03:16,960 --> 00:03:18,950 αυτομάτως απορρίπτεται. 69 00:03:18,950 --> 00:03:23,290 Έτσι σκέφτονται devnull ως μια μαύρη τρύπα για τα δεδομένα σας. 70 00:03:23,290 --> 00:03:26,070 >> Μέχρι τώρα έχουμε δει πως η μεγαλύτερη από ό, τι σημάδι μπορεί να ανακατευθύνει 71 00:03:26,070 --> 00:03:29,610 stdout, ας δούμε πώς μπορούμε να ανακατευθύνει στο πρότυπο - 72 00:03:29,610 --> 00:03:31,250 ή s-τ-ά-σε - 73 00:03:31,250 --> 00:03:33,550 το ανάλογο stdout. 74 00:03:33,550 --> 00:03:36,010 Ενώ λειτουργίες όπως printf γράφουν στο ρεύμα που ονομάζεται 75 00:03:36,010 --> 00:03:40,500 stdout, GetString και παρόμοιες λειτουργίες ανάγνωσης από το ρεύμα 76 00:03:40,500 --> 00:03:43,770 που ονομάζεται stdin, η οποία, εξ ορισμού, είναι το ρεύμα της 77 00:03:43,770 --> 00:03:46,290 χαρακτήρες πληκτρολογούνται στο πληκτρολόγιο. 78 00:03:46,290 --> 00:03:50,010 Μπορούμε να ανακατευθύνει stdin χρησιμοποιώντας το μικρότερο σημάδι, ακολουθούμενη 79 00:03:50,010 --> 00:03:51,370 από ένα όνομα αρχείου. 80 00:03:51,370 --> 00:03:54,000 Τώρα, αντί να ζητά από το χρήστη για την είσοδο σε ο 81 00:03:54,000 --> 00:03:57,870 τερματικό, ένα πρόγραμμα θα ανοίξει το αρχείο που καθορίζεται και χρήση 82 00:03:57,870 --> 00:03:59,790 γραμμές του σαν είσοδο. 83 00:03:59,790 --> 00:04:02,620 >> Ας δούμε τι θα συμβεί. 84 00:04:02,620 --> 00:04:03,280 Μεγάλη. 85 00:04:03,280 --> 00:04:07,590 Η πρώτη γραμμή του file.txt έχει τυπωθεί στο τερματικό 86 00:04:07,590 --> 00:04:10,160 επειδή είμαστε καλώντας GetString φορά. 87 00:04:10,160 --> 00:04:13,170 Αν είχαμε μια άλλη κλήση σε GetString στο πρόγραμμά μας, το 88 00:04:13,170 --> 00:04:16,149 επόμενη γραμμή file.txt θα είχαν χρησιμοποιηθεί ως 89 00:04:16,149 --> 00:04:17,990 εισόδου στην εν λόγω πρόσκληση. 90 00:04:17,990 --> 00:04:21,050 Και πάλι, δεν έχουμε τροποποιημένο πρόγραμμα C μας σε όλα. 91 00:04:21,050 --> 00:04:23,620 Είμαστε μόνο αλλάζουν τον τρόπο να τρέξει. 92 00:04:23,620 --> 00:04:27,080 Και να θυμάστε, επίσης, δεν έχουμε ανακατεύθυνση stdout αυτή τη φορά, 93 00:04:27,080 --> 00:04:28,970 έτσι ώστε η έξοδος του προγράμματος ήταν ακόμη 94 00:04:28,970 --> 00:04:31,040 εμφανίζεται στο τερματικό. 95 00:04:31,040 --> 00:04:33,500 Μπορούμε, βέβαια, να κατευθύνει τόσο stdin 96 00:04:33,500 --> 00:04:37,320 και stdout σαν αυτό. 97 00:04:37,320 --> 00:04:43,550 Τώρα, file2.txt περιέχει την πρώτη γραμμή του file.txt. 98 00:04:43,550 --> 00:04:46,140 >> Έτσι, με τη χρήση αυτών των φορέων, είμαστε σε θέση να διαβάζουν και να 99 00:04:46,140 --> 00:04:48,130 γράψετε από αρχεία κειμένου. 100 00:04:48,130 --> 00:04:51,890 Τώρα, ας δούμε πώς μπορούμε να χρησιμοποιήσουμε την έξοδο ενός προγράμματος, όπως 101 00:04:51,890 --> 00:04:54,710 η είσοδος σε ένα άλλο πρόγραμμα. 102 00:04:54,710 --> 00:04:56,650 Έτσι, εδώ είναι ένα άλλο απλό πρόγραμμα Γ Ι 103 00:04:56,650 --> 00:05:00,190 έχουν ζητήσει εδώ hello.c. 104 00:05:00,190 --> 00:05:02,617 Όπως μπορείτε να δείτε, αυτό εξάγει απλά "Γεια 105 00:05:02,617 --> 00:05:04,430 εκεί! "στο χρήστη. 106 00:05:04,430 --> 00:05:08,890 Αν θέλω να ανακατευθύνει χρησιμοποιούν ως είσοδο την έξοδο του γειά σου - 107 00:05:08,890 --> 00:05:10,190 ένα άλλο πρόγραμμα - 108 00:05:10,190 --> 00:05:13,920 Θα μπορούσα να ανακατευθύνει πρώτα το stdout του γειά σου σε ένα αρχείο που ονομάζεται 109 00:05:13,920 --> 00:05:18,960 input.txt, ανακατευθύνει στη συνέχεια το stdin της ανακατευθύνει στην ίδια 110 00:05:18,960 --> 00:05:21,190 αρχείο - INPUT.TXT. 111 00:05:21,190 --> 00:05:26,730 Έτσι, μπορώ να κάνω. / Γεια> INPUT.TXT. 112 00:05:26,730 --> 00:05:28,810 Πατήστε το πλήκτρο Enter για να εκτελέσει αυτό. 113 00:05:28,810 --> 00:05:31,910 Ακολούθησε. / Redirect < 114 00:05:31,910 --> 00:05:35,270 INPUT.TXT, ότι και να εκτελέσει. 115 00:05:35,270 --> 00:05:38,290 Έτσι, μπορούμε να συντομεύσουμε αυτό το λίγο με ένα ερωτηματικό, το οποίο επιτρέπει 116 00:05:38,290 --> 00:05:41,360 μας να τρέξει δύο ή περισσότερες εντολές στην ίδια γραμμή. 117 00:05:41,360 --> 00:05:47,920 Έτσι, μπορώ να πω,. / Γειά σου> input.txt, ερωτηματικό, 118 00:05:47,920 --> 00:05:50,580 . / Redirect 00:05:56,740 >> Έτσι, αυτή η εργασία, αλλά εξακολουθεί να αισθάνεται αρκετά άκομψο. 120 00:05:56,740 --> 00:05:59,530 Θέλω να πω, δεν χρειαζόμαστε πραγματικά αυτό το αρχείο κειμένου που είναι ενδιάμεσο 121 00:05:59,530 --> 00:06:02,520 δεν είναι πλέον αναγκαία αφού ανακατευθύνει τρεξίματα; 122 00:06:02,520 --> 00:06:05,780 Ευτυχώς, μπορούμε να αποφύγουμε αυτό το επιπλέον αρχείο κειμένου χρησιμοποιώντας ό, τι είναι 123 00:06:05,780 --> 00:06:07,220 ονομάζεται ένας σωλήνας. 124 00:06:07,220 --> 00:06:13,740 Αν λέω, / γεια |.. / Ανακατεύθυνση, τότε το stdout της 125 00:06:13,740 --> 00:06:15,310 το πρόγραμμα για την αριστερά - 126 00:06:15,310 --> 00:06:16,740 σε αυτή την περίπτωση, γειά σου - 127 00:06:16,740 --> 00:06:18,970 θα χρησιμοποιηθεί ως πρότυπο για την είσοδο 128 00:06:18,970 --> 00:06:20,370 πρόγραμμα στα δεξιά. 129 00:06:20,370 --> 00:06:24,850 Σε αυτή την περίπτωση, ανακατευθύνει. Ας τρέξει αυτό. 130 00:06:24,850 --> 00:06:25,930 >> Εκεί πάμε. 131 00:06:25,930 --> 00:06:30,080 Μπορούμε να δούμε ότι η έξοδος της γεια χρησιμοποιήθηκε ως είσοδος 132 00:06:30,080 --> 00:06:31,520 για ανακατεύθυνση. 133 00:06:31,520 --> 00:06:34,890 Με stringing εντολές μεταξύ τους χρησιμοποιώντας σωλήνες, που σχηματίζουν ό, τι είναι 134 00:06:34,890 --> 00:06:38,120 ονομάζεται αγωγός, δεδομένου ότι η παραγωγή μας είναι ουσιαστικά κινείται 135 00:06:38,120 --> 00:06:40,590 μέσα από μια σειρά εντολών. 136 00:06:40,590 --> 00:06:43,570 Χρησιμοποιώντας σωλήνες, μπορούμε να κάνουμε κάποια δροσερή ουσία χωρίς να χρειάζεται να 137 00:06:43,570 --> 00:06:45,870 γράψετε οποιοδήποτε κώδικα καθόλου. 138 00:06:45,870 --> 00:06:48,760 Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να γνωρίζουμε πόσα είναι τα αρχεία 139 00:06:48,760 --> 00:06:50,630 μέσα από αυτόν τον κατάλογο. 140 00:06:50,630 --> 00:06:55,200 Χρησιμοποιώντας ένα σωλήνα, μπορούμε να συνδυάσουμε την εντολή ls με το wc - 141 00:06:55,200 --> 00:06:56,460 ή wordcount - 142 00:06:56,460 --> 00:06:57,850 εντολή. 143 00:06:57,850 --> 00:07:02,230 Ls θα εμφανίσει κάθε αρχείο στον κατάλογο στο stdout, και 144 00:07:02,230 --> 00:07:08,040 wc θα μας πει πόσες γραμμές δόθηκαν σε αυτό μέσω stdin. 145 00:07:08,040 --> 00:07:12,440 Έτσι, αν πούμε ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 την παροχή των-l σημαία να wc να το πω για να μετρήσει τις γραμμές - 147 00:07:16,800 --> 00:07:19,260 μπορούμε να δούμε ακριβώς πόσα αρχεία είναι 148 00:07:19,260 --> 00:07:21,940 στον τρέχοντα κατάλογο. 149 00:07:21,940 --> 00:07:24,570 >> Έτσι, ας ρίξουμε μια ματιά σε ένα ακόμη παράδειγμα. 150 00:07:24,570 --> 00:07:27,740 Έχω εδώ ένα αρχείο που ονομάζεται students.txt, 151 00:07:27,740 --> 00:07:29,600 με μια λίστα ονομάτων. 152 00:07:29,600 --> 00:07:32,730 Ωστόσο, οι ονομασίες αυτές δεν είναι σε οποιαδήποτε σειρά όλα, και φαίνεται 153 00:07:32,730 --> 00:07:34,850 όπως επαναλαμβάνονται μερικά ονόματα. 154 00:07:34,850 --> 00:07:38,510 Αυτό που θέλουμε είναι μια λίστα με μοναδικά ονόματα σε αλφαβητική 155 00:07:38,510 --> 00:07:42,550 Προκειμένου, αποθηκεύονται σε ένα αρχείο με όνομα final.txt. 156 00:07:42,550 --> 00:07:45,210 Θα μπορούσαμε, βέβαια, να γράψετε ένα πρόγραμμα C για να το κάνετε αυτό για εμάς. 157 00:07:45,210 --> 00:07:46,560 Αλλά αυτό πρόκειται να πάρει άσκοπα 158 00:07:46,560 --> 00:07:48,560 πολύπλοκη αρκετά γρήγορα. 159 00:07:48,560 --> 00:07:51,740 Ας χρησιμοποιήσουμε αντί για σωλήνες και κάποια built-in-εργαλεία για την επίλυση 160 00:07:51,740 --> 00:07:53,300 αυτό το πρόβλημα. 161 00:07:53,300 --> 00:07:57,760 >> Το πρώτο πράγμα που πρέπει να κάνετε είναι να διαβάσετε το αρχείο students.txt. 162 00:07:57,760 --> 00:08:00,530 Η εντολή cat θα κάνουν ακριβώς αυτό. 163 00:08:00,530 --> 00:08:03,230 Θα διαβάσετε το καθορισμένο αρχείο και να γράφουν 164 00:08:03,230 --> 00:08:05,750 το περιεχόμενό του στο stdout. 165 00:08:05,750 --> 00:08:07,570 Αφού έχετε διαβάσει το αρχείο κειμένου, θα 166 00:08:07,570 --> 00:08:09,490 θέλετε να ταξινομήσετε τα ονόματα. 167 00:08:09,490 --> 00:08:12,510 Η εντολή ταξινόμησης μπορεί να χειριστεί αυτό για εμάς. 168 00:08:12,510 --> 00:08:16,830 Ταξινόμηση θα εμφανίσει τη γραμμή που παρέχονται μέσω stdin στο stdout 169 00:08:16,830 --> 00:08:19,310 σε ταξινομημένη σειρά. 170 00:08:19,310 --> 00:08:23,450 Με σκοπό την παροχή των περιεχομένων του σε students.txt 171 00:08:23,450 --> 00:08:29,600 stdin είδος του, θα μπορούσαμε να χρησιμοποιήσουμε ένα σωλήνα για να συνδυάσει τη γάτα και το είδος. 172 00:08:29,600 --> 00:08:34,440 Γι 'αυτό και μπορεί να εκτελέσει γάτα students.txt | είδος και 173 00:08:34,440 --> 00:08:35,640 πατήστε το πλήκτρο Enter. 174 00:08:35,640 --> 00:08:39,309 Και τώρα, βλέπουμε τα περιεχόμενα του σε students.txt 175 00:08:39,309 --> 00:08:40,909 αλφαβητική σειρά. 176 00:08:40,909 --> 00:08:42,860 >> Έτσι, ας προσθέσουμε άλλη εντολή - 177 00:08:42,860 --> 00:08:44,730 uniq, ή μοναδική - 178 00:08:44,730 --> 00:08:46,230 σε αγωγό μας. 179 00:08:46,230 --> 00:08:49,810 Όπως μπορείτε να μαντέψετε, uniq, όταν παρέχεται μια ταξινομημένη ακολουθία του 180 00:08:49,810 --> 00:08:53,650 γραμμές μέσω stdin, θα εμφανίσει τις μοναδικές γραμμές. 181 00:08:53,650 --> 00:08:56,910 Έτσι τώρα έχουμε students.txt γάτα 182 00:08:56,910 --> 00:09:00,040 | Sort | uniq. 183 00:09:00,040 --> 00:09:03,330 Τέλος, μπορούμε να σώσουμε την έξοδο του αγωγού σε ένα 184 00:09:03,330 --> 00:09:09,090 αρχείο μέσω γάτα students.txt | sort | uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Έτσι, αν έχουμε ανοίξει final.txt, έχουμε ακριβώς αυτό που ήταν 187 00:09:16,260 --> 00:09:17,270 ψάχνουν για: 188 00:09:17,270 --> 00:09:20,180 μια λίστα με μοναδικά ονόματα σε αλφαβητική σειρά, 189 00:09:20,180 --> 00:09:22,150 αποθηκεύονται σε ένα αρχείο κειμένου. 190 00:09:22,150 --> 00:09:26,020 Με τον τρόπο αυτό, θα μπορούσε επίσης να πει είδος < 191 00:09:26,020 --> 00:09:32,290 students.txt | uniq> final.txt να κάνει ακριβώς 192 00:09:32,290 --> 00:09:35,400 το ίδιο πράγμα, με κάθε μία από τις επιχειρήσεις που έχουμε δει σε 193 00:09:35,400 --> 00:09:36,580 αυτό το βίντεο. 194 00:09:36,580 --> 00:09:39,540 >> Το όνομά μου είναι ο Tommy, και αυτό είναι CS50.