1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [File I / O] 2 00:00:02,000 --> 00:00:04,000 [Jason Hirschhorn, Đại học Harvard] 3 00:00:04,000 --> 00:00:07,000 [Đây là CS50, CS50.TV] 4 00:00:07,000 --> 00:00:11,000 Khi chúng ta nghĩ về một tập tin, những gì đến với tâm là một tài liệu Microsoft Word, 5 00:00:11,000 --> 00:00:14,000 một hình ảnh JPEG, hoặc bài hát MP3, 6 00:00:14,000 --> 00:00:17,000 và chúng ta tương tác với nhau của các loại tập tin theo nhiều cách khác nhau. 7 00:00:17,000 --> 00:00:20,000 Ví dụ, trong một tài liệu Word, chúng tôi thêm văn bản 8 00:00:20,000 --> 00:00:24,000 trong khi với một hình ảnh JPEG, chúng tôi có thể cắt ra các cạnh hoặc tút lại màu sắc. 9 00:00:24,000 --> 00:00:28,000 Tuy nhiên, dưới mui xe tất cả các tập tin trong máy tính của chúng tôi là không có gì hơn nữa 10 00:00:28,000 --> 00:00:31,000 hơn một chuỗi dài các số không và những người thân. 11 00:00:31,000 --> 00:00:33,000 Nó thuộc vào ứng dụng cụ thể tương tác với các tập tin 12 00:00:33,000 --> 00:00:38,000 để quyết định làm thế nào để xử lý chuỗi dài này và trình bày nó cho người dùng. 13 00:00:38,000 --> 00:00:41,000 Trên một bàn tay, một tài liệu có thể nhìn vào chỉ một byte, 14 00:00:41,000 --> 00:00:45,000 hoặc 8 số không và những người thân, và hiển thị một ký tự ASCII trên màn hình. 15 00:00:45,000 --> 00:00:48,000 Mặt khác, một hình ảnh bitmap có thể nhìn vào 3 byte, 16 00:00:48,000 --> 00:00:50,000 hoặc 24 số không và những người thân, 17 00:00:50,000 --> 00:00:53,000 và giải thích cho họ là 3 số thập lục phân 18 00:00:53,000 --> 00:00:56,000 đại diện cho các giá trị cho màu đỏ, xanh lá cây, và màu xanh 19 00:00:56,000 --> 00:00:58,000 trong một pixel của một hình ảnh. 20 00:00:58,000 --> 00:01:01,000 Dù họ có thể trông giống như trên màn hình của bạn, tại cốt lõi của họ, 21 00:01:01,000 --> 00:01:05,000 tập tin này là không có gì nhiều hơn một chuỗi các số không và những người thân. 22 00:01:05,000 --> 00:01:08,000 Vì vậy, hãy nhảy vào và xem xét làm thế nào chúng ta thực sự thao tác các số không và những người thân 23 00:01:08,000 --> 00:01:12,000 khi nói đến văn bản và đọc từ một tập tin. 24 00:01:12,000 --> 00:01:15,000 >> Tôi sẽ bắt đầu bằng cách phá vỡ nó xuống thành một quá trình 3-phần đơn giản. 25 00:01:15,000 --> 00:01:19,000 Tiếp theo, tôi sẽ nhảy vào hai ví dụ mã chứng minh những ba phần. 26 00:01:19,000 --> 00:01:23,000 Cuối cùng, tôi sẽ xem xét quá trình và một số chi tiết quan trọng nhất. 27 00:01:23,000 --> 00:01:25,000 Như với bất kỳ tập tin mà ngồi trên máy tính để bàn của bạn, 28 00:01:25,000 --> 00:01:28,000 Điều đầu tiên cần làm là để mở nó. 29 00:01:28,000 --> 00:01:31,000 Trong C, chúng tôi làm điều này bằng cách tuyên bố một con trỏ đến một cấu trúc được xác định trước 30 00:01:31,000 --> 00:01:33,000 đại diện cho một tập tin trên đĩa. 31 00:01:33,000 --> 00:01:38,460 Trong cuộc gọi chức năng này, chúng tôi cũng quyết định xem chúng ta muốn viết hoặc đọc từ tập tin. 32 00:01:38,460 --> 00:01:41,660 Tiếp theo, chúng tôi đọc và viết thực tế. 33 00:01:41,660 --> 00:01:44,800 Có một số chức năng chuyên biệt, chúng tôi có thể sử dụng trong phần này, 34 00:01:44,800 --> 00:01:48,790 và gần như tất cả trong số họ bắt đầu với F với doanh nghiệp, đó là viết tắt cho tập tin. 35 00:01:48,790 --> 00:01:53,560 Cuối cùng, giống như dấu X đỏ nhỏ ở góc trên cùng của các tập tin mở trên máy tính của bạn, 36 00:01:53,560 --> 00:01:56,680 chúng tôi đóng tập tin với một cuộc gọi chức năng cuối cùng. 37 00:01:56,680 --> 00:01:59,540 Bây giờ chúng ta có một ý tưởng chung của những gì chúng ta sẽ làm, 38 00:01:59,540 --> 00:02:02,000 chúng ta hãy đi sâu vào các mã. 39 00:02:02,000 --> 00:02:06,100 >> Trong thư mục này, chúng tôi có hai C tập tin và các tập tin thực thi tương ứng của họ. 40 00:02:06,100 --> 00:02:09,710 Chương trình máy đánh chữ mất một đối số dòng lệnh, 41 00:02:09,710 --> 00:02:12,060 tên tài liệu, chúng tôi muốn tạo ra. 42 00:02:12,060 --> 00:02:16,160 Trong trường hợp này, chúng ta sẽ gọi nó doc.txt. 43 00:02:16,160 --> 00:02:19,080 Hãy chạy chương trình và nhập một vài dòng. 44 00:02:19,080 --> 00:02:23,660 Hi. Tên tôi là Jason. 45 00:02:23,660 --> 00:02:26,710 Cuối cùng, chúng tôi sẽ gõ "bỏ thuốc lá." 46 00:02:26,710 --> 00:02:29,720 Nếu bây giờ chúng ta liệt kê tất cả các file trong thư mục này, 47 00:02:29,720 --> 00:02:33,770 chúng ta thấy rằng một tài liệu mới tồn tại được gọi là doc.txt. 48 00:02:34,190 --> 00:02:36,110 Đó là tập tin chương trình này chỉ tạo ra. 49 00:02:36,110 --> 00:02:40,520 Và tất nhiên, nó quá là không có gì nhiều hơn một chuỗi dài các số không và những người thân. 50 00:02:41,100 --> 00:02:43,260 Nếu chúng ta mở tập tin này mới, 51 00:02:43,260 --> 00:02:45,870 chúng ta thấy 3 dòng mã chúng tôi đã nhập vào chương trình của chúng tôi - 52 00:02:46,060 --> 00:02:49,060 Hi. May tên là Jason. 53 00:02:49,580 --> 00:02:52,090 Nhưng những gì đang thực sự xảy ra khi typewriter.c chạy? 54 00:02:52,810 --> 00:02:55,520 Dòng đầu tiên quan tâm cho chúng ta là dòng 24. 55 00:02:55,560 --> 00:02:58,490 Trong đường dây này, chúng ta khai báo con trỏ tập tin của chúng tôi. 56 00:02:59,080 --> 00:03:03,140 Chức năng trả về con trỏ, fopen, có hai đối số. 57 00:03:03,140 --> 00:03:07,440 Đầu tiên là tên tập tin bao gồm cả phần mở rộng tập tin nếu thích hợp. 58 00:03:07,440 --> 00:03:10,980 Nhớ lại rằng một phần mở rộng tập tin không ảnh hưởng đến các tập tin ở mức thấp nhất. 59 00:03:10,980 --> 00:03:14,640 Chúng tôi luôn đối phó với một chuỗi dài các số không và những người thân. 60 00:03:14,640 --> 00:03:19,630 Nhưng nó có ảnh hưởng như thế nào các tập tin được giải thích và những ứng dụng được sử dụng để mở chúng. 61 00:03:19,630 --> 00:03:22,290 Đối số thứ hai để fopen là một lá thư duy nhất 62 00:03:22,290 --> 00:03:25,300 là viết tắt của những gì chúng tôi dự định làm gì sau khi chúng tôi mở tập tin. 63 00:03:25,300 --> 00:03:30,630 Có ba lựa chọn cho lập luận này - W, R, và A. 64 00:03:30,630 --> 00:03:34,900 Chúng tôi đã chọn w trong trường hợp này bởi vì chúng tôi muốn ghi vào tập tin. 65 00:03:34,900 --> 00:03:38,820 R, như bạn có thể đoán, là để đọc tập tin. 66 00:03:38,820 --> 00:03:41,760 Và một là để phụ thêm vào tập tin. 67 00:03:41,760 --> 00:03:44,960 Trong khi cả hai w và có thể được sử dụng để ghi vào tập tin, 68 00:03:44,960 --> 00:03:47,460 w sẽ bắt đầu viết từ đầu của tập tin 69 00:03:47,460 --> 00:03:50,810 và có khả năng ghi đè lên bất kỳ dữ liệu đã được lưu trữ trước đó. 70 00:03:50,810 --> 00:03:54,070 Theo mặc định, tập tin mở, nếu nó không tồn tại, 71 00:03:54,070 --> 00:03:57,180 được tạo ra trong thư mục làm việc hiện tại của chúng tôi. 72 00:03:57,180 --> 00:04:00,540 Tuy nhiên, nếu chúng ta muốn truy cập hoặc tạo ra một tập tin trong một vị trí khác, 73 00:04:00,540 --> 00:04:02,650 trong số đầu tiên của fopen, 74 00:04:02,650 --> 00:04:05,840 chúng tôi có thể chỉ định một đường dẫn tập tin thêm vào tên file. 75 00:04:05,840 --> 00:04:09,490 Trong khi phần đầu tiên của quá trình này là chỉ có một dòng mã dài, 76 00:04:09,490 --> 00:04:12,350 nó luôn luôn là tốt thực hành để bao gồm một tập hợp các đường 77 00:04:12,350 --> 00:04:15,930 mà kiểm tra để đảm bảo rằng tập tin đã thành công đã mở hoặc tạo ra. 78 00:04:15,930 --> 00:04:20,300 Nếu fopen trả về null, chúng tôi sẽ không muốn giả mạo trước với chương trình của chúng tôi, 79 00:04:20,300 --> 00:04:23,270 và điều này có thể xảy ra khi hệ điều hành ra khỏi bộ nhớ 80 00:04:23,270 --> 00:04:27,940 hoặc nếu chúng tôi cố gắng để mở một tập tin trong một thư mục mà chúng tôi đã không có sự cho phép thích hợp. 81 00:04:27,940 --> 00:04:31,780 >> Phần hai của quá trình này diễn ra trong vòng lặp trong khi của máy đánh chữ. 82 00:04:31,780 --> 00:04:35,000 Chúng tôi sử dụng một chức năng thư viện CS50 để có được đầu vào từ người sử dụng, 83 00:04:35,000 --> 00:04:37,190 và giả sử họ không muốn để thoát khỏi chương trình, 84 00:04:37,190 --> 00:04:41,940 chúng tôi sử dụng fputs chức năng dùng chuỗi và viết nó vào tập tin. 85 00:04:41,940 --> 00:04:46,700 fputs là chỉ là một trong nhiều chức năng chúng ta có thể sử dụng để ghi vào tập tin. 86 00:04:46,700 --> 00:04:51,920 Những người khác bao gồm fwrite, fputc, và thậm chí fprintf. 87 00:04:51,920 --> 00:04:54,840 Bất kể chức năng cụ thể, chúng tôi kết thúc bằng cách sử dụng, mặc dù, 88 00:04:54,840 --> 00:04:57,480 tất cả đều cần phải biết, thông qua các lập luận của họ, 89 00:04:57,480 --> 00:04:59,670 ít nhất hai thứ - 90 00:04:59,670 --> 00:05:03,140 những gì cần phải được bằng văn bản và nơi nó cần phải được ghi vào. 91 00:05:03,140 --> 00:05:07,240 Trong trường hợp của chúng tôi, đầu vào là chuỗi cần phải được viết 92 00:05:07,240 --> 00:05:11,290 và fp là con trỏ hướng dẫn chúng ta đến nơi mà chúng ta đang viết. 93 00:05:11,290 --> 00:05:15,330 Trong chương trình này, phần hai của quá trình này là khá đơn giản. 94 00:05:15,330 --> 00:05:17,360 Chúng tôi chỉ đơn giản là một chuỗi từ người sử dụng 95 00:05:17,360 --> 00:05:22,120 và thêm nó trực tiếp vào tập tin của chúng tôi với rất ít-to-đầu vào hoặc không có xác nhận kiểm tra an ninh. 96 00:05:22,120 --> 00:05:26,160 Thường, tuy nhiên, phần hai sẽ mất phần lớn các mã của bạn. 97 00:05:26,160 --> 00:05:30,580 Cuối cùng, một phần ba là trên đường 58, nơi chúng tôi đóng file. 98 00:05:30,580 --> 00:05:34,860 Ở đây chúng ta gọi fclose và vượt qua nó con trỏ tập tin ban đầu của chúng tôi. 99 00:05:34,860 --> 00:05:39,500 Trong dòng tiếp theo, chúng tôi trở về số không, báo hiệu sự kết thúc của chương trình của chúng tôi. 100 00:05:39,500 --> 00:05:42,630 Và, có, một phần ba là đơn giản như vậy. 101 00:05:42,630 --> 00:05:45,260 >> Hãy di chuyển để đọc từ các tập tin. 102 00:05:45,260 --> 00:05:48,220 Trở lại trong thư mục của chúng tôi, chúng tôi có một tập tin gọi printer.c. 103 00:05:48,220 --> 00:05:50,910 Hãy để chạy nó với các tập tin chúng ta vừa tạo - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 Chương trình này, như tên cho thấy, chỉ đơn giản là sẽ in ra nội dung của tập tin được truyền cho nó. 106 00:05:58,150 --> 00:06:00,230 Và chúng tôi đã có nó. 107 00:06:00,230 --> 00:06:03,780 Các dòng mã, chúng tôi đã nhập trước đó và lưu trong doc.txt. 108 00:06:03,780 --> 00:06:06,980 Hi. Tên tôi là Jason. 109 00:06:06,980 --> 00:06:09,120 Nếu chúng ta đi sâu vào printer.c, 110 00:06:09,120 --> 00:06:13,570 chúng ta thấy rằng rất nhiều của mã này trông tương tự như những gì chúng tôi vừa đi qua trong typewriter.c. 111 00:06:13,570 --> 00:06:16,720 Thực tế dòng 22, chúng tôi đã mở các tập tin, 112 00:06:16,720 --> 00:06:19,220 và dòng 39, nơi chúng tôi đóng tập tin, 113 00:06:19,220 --> 00:06:23,890 cả hai đều gần giống như typewriter.c, tiết kiệm cho lập luận fopen thứ hai. 114 00:06:23,890 --> 00:06:26,510 Thời gian này chúng tôi đang đọc từ một tập tin, 115 00:06:26,510 --> 00:06:29,040 vì vậy chúng tôi đã chọn r thay vì của w. 116 00:06:29,040 --> 00:06:31,950 Như vậy, chúng ta hãy tập trung vào phần thứ hai của quá trình này. 117 00:06:31,950 --> 00:06:36,060 Trong dòng 35, là điều kiện thứ hai trong vòng 4 của chúng tôi, 118 00:06:36,060 --> 00:06:38,590 chúng tôi thực hiện cuộc gọi fgets 119 00:06:38,590 --> 00:06:42,190 chức năng đồng hành với fputs từ trước. 120 00:06:42,190 --> 00:06:44,660 Lần này, chúng tôi có ba đối số. 121 00:06:44,660 --> 00:06:48,810 Đầu tiên là con trỏ đến các mảng của các ký tự chuỗi sẽ được lưu trữ. 122 00:06:48,810 --> 00:06:52,670 Thứ hai là số ký tự tối đa để được đọc. 123 00:06:52,670 --> 00:06:56,010 Và thứ ba là con trỏ đến các tập tin mà chúng ta đang làm việc. 124 00:06:56,010 --> 00:07:00,780 Bạn sẽ nhận thấy rằng cho vòng lặp kết thúc khi fgets trả về null. 125 00:07:00,780 --> 00:07:02,940 Có hai lý do rằng điều này có thể xảy ra. 126 00:07:02,940 --> 00:07:05,380 Đầu tiên, một lỗi có thể đã xảy ra. 127 00:07:05,380 --> 00:07:10,740 Thứ hai, và nhiều khả năng, sự kết thúc của tập tin đã đạt được và ký tự không được đọc. 128 00:07:10,740 --> 00:07:14,040 Trong trường hợp bạn đang tự hỏi, hai chức năng tồn tại cho phép chúng tôi để 129 00:07:14,040 --> 00:07:17,160 lý do là nguyên nhân gây ra cho con trỏ null cụ thể. 130 00:07:17,160 --> 00:07:21,090 Và, không có gì đáng ngạc nhiên, kể từ khi họ có để làm với làm việc với các tập tin, 131 00:07:21,090 --> 00:07:26,940 cả hai chức năng ferror và bắt đầu chức năng feof với chữ f. 132 00:07:26,940 --> 00:07:32,130 >> Cuối cùng, trước khi chúng tôi kết luận, một lưu ý nhanh chóng về sự kết thúc của chức năng tập tin, 133 00:07:32,130 --> 00:07:36,690 trong đó, như vừa đề cập, được viết như feof. 134 00:07:36,690 --> 00:07:41,550 Thường thì bạn sẽ tìm thấy chính mình bằng cách sử dụng thời gian và cho các vòng để dần dần đọc theo cách của bạn thông qua các file. 135 00:07:41,550 --> 00:07:45,790 Vì vậy, bạn sẽ cần một cách để kết thúc những vòng sau khi bạn đến cuối của những tập tin này. 136 00:07:45,790 --> 00:07:50,510 Gọi feof trên con trỏ tập tin của bạn và kiểm tra để xem nếu nó là sự thật 137 00:07:50,510 --> 00:07:52,310 sẽ làm điều đó. 138 00:07:52,310 --> 00:07:59,820 Do đó, một vòng lặp trong khi với điều kiện (feof (fp)) có vẻ như một giải pháp hoàn toàn thích hợp. 139 00:07:59,820 --> 00:08:03,770 Tuy nhiên, nói rằng chúng tôi có một dòng còn lại trong tập tin văn bản của chúng tôi. 140 00:08:03,770 --> 00:08:07,130 Chúng tôi sẽ nhập vào vòng lặp trong khi của chúng tôi và tất cả mọi thứ sẽ làm việc theo kế hoạch. 141 00:08:07,130 --> 00:08:12,750 Vòng tiếp theo thông qua, chương trình của chúng tôi sẽ kiểm tra xem nếu feof fp là đúng, 142 00:08:12,750 --> 00:08:15,430 nhưng - và đây là điểm rất quan trọng để hiểu ở đây - 143 00:08:15,430 --> 00:08:17,770 nó sẽ không là sự thật chỉ được nêu ra. 144 00:08:17,770 --> 00:08:21,110 Đó là bởi vì mục đích của feof không phải là để kiểm tra 145 00:08:21,110 --> 00:08:24,400 nếu cuộc gọi bên cạnh một chức năng đọc sẽ được tung ra cuối của tập tin, 146 00:08:24,400 --> 00:08:28,190 mà là để kiểm tra hay không cuối của tập tin đã đạt được. 147 00:08:28,190 --> 00:08:30,140 Trong trường hợp của ví dụ này, 148 00:08:30,140 --> 00:08:32,780 đọc dòng cuối cùng của tập tin của chúng tôi đi hoàn toàn trơn tru, 149 00:08:32,780 --> 00:08:36,210 nhưng chương trình không biết rằng chúng tôi đã đạt kết thúc của tập tin của chúng tôi. 150 00:08:36,210 --> 00:08:40,549 Nó không phải cho đến khi nó làm một đọc thêm mà nó đếm cuối của tập tin. 151 00:08:40,549 --> 00:08:43,210 Như vậy, một điều kiện chính xác sẽ được như sau: 152 00:08:43,210 --> 00:08:49,330 fgets và ba đối số - đầu ra, kích thước của đầu ra, và fp - 153 00:08:49,330 --> 00:08:52,570 và tất cả các điều đó không bằng giá trị null. 154 00:08:52,570 --> 00:08:55,260 Đây là cách tiếp cận chúng tôi đã printer.c, 155 00:08:55,260 --> 00:08:57,890 và trong trường hợp này, sau khi thoát khỏi vòng lặp, 156 00:08:57,890 --> 00:09:04,290 bạn có thể gọi feof hoặc ferror để thông báo cho người sử dụng như các lý do cụ thể để thoát khỏi vòng lặp này. 157 00:09:04,290 --> 00:09:08,100 >> Viết và đọc từ một tập tin, tại cơ bản nhất của nó, 158 00:09:08,100 --> 00:09:10,150 a 3-một phần quá trình đơn giản. 159 00:09:10,150 --> 00:09:12,530 Đầu tiên, chúng ta mở tập tin. 160 00:09:12,530 --> 00:09:16,740 Thứ hai, chúng tôi đặt một số điều vào tập tin của chúng tôi hoặc mất một số thứ ra khỏi nó. 161 00:09:16,740 --> 00:09:19,200 Thứ ba, chúng tôi đóng tập tin. 162 00:09:19,200 --> 00:09:21,170 Các bộ phận đầu tiên và cuối cùng là dễ dàng. 163 00:09:21,170 --> 00:09:23,920 Phần giữa là nơi mà các công cụ phức tạp nằm. 164 00:09:23,920 --> 00:09:27,760 Và mặc dù bên dưới mui xe chúng tôi luôn phải đối đầu với một chuỗi dài các số không và những người thân, 165 00:09:27,760 --> 00:09:30,710 nó sẽ giúp khi mã hóa để thêm một lớp trừu tượng 166 00:09:30,710 --> 00:09:35,350 biến chuỗi thành một cái gì đó rất giống với những gì chúng tôi đang sử dụng để nhìn thấy. 167 00:09:35,350 --> 00:09:39,570 Ví dụ, nếu chúng ta đang làm việc với một tập tin bitmap 24-bit, 168 00:09:39,570 --> 00:09:43,290 chúng tôi có khả năng sẽ được đọc hoặc viết ba byte tại một thời điểm. 169 00:09:43,290 --> 00:09:46,450 Trong trường hợp đó, nó sẽ làm cho tinh thần để xác định và thích hợp tên 170 00:09:46,450 --> 00:09:48,980 một cấu trúc là 3 byte lớn. 171 00:09:48,980 --> 00:09:51,410 >> Mặc dù làm việc với các tập tin có thể có vẻ phức tạp, 172 00:09:51,410 --> 00:09:54,530 sử dụng chúng cho phép chúng ta làm một cái gì đó thật sự đáng chú ý. 173 00:09:54,530 --> 00:09:58,880 Chúng ta có thể thay đổi trạng thái của thế giới bên ngoài chương trình của chúng tôi, 174 00:09:58,880 --> 00:10:01,730 chúng ta có thể tạo ra một cái gì đó sống vượt ra ngoài cuộc sống của chương trình của chúng tôi, 175 00:10:01,730 --> 00:10:07,190 hoặc chúng ta thậm chí có thể thay đổi một cái gì đó đã được tạo ra trước khi chương trình của chúng tôi bắt đầu chạy. 176 00:10:07,190 --> 00:10:11,210 Tương tác với các tập tin là một phần thực sự mạnh mẽ của chương trình trong C. 177 00:10:11,210 --> 00:10:15,300 và tôi vui mừng để xem những gì bạn đang đi để tạo ra với nó trong mã đến. 178 00:10:15,300 --> 00:10:19,770 Tên tôi là Jason Hirschhorn. Đây là CS50. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [Cười] 181 00:10:25,940 --> 00:10:29,330 Okay. Một lần quay. Ở đây chúng tôi đi. 182 00:10:49,000 --> 00:10:52,140 Khi chúng ta nghĩ về một tập tin - >> Oh, chờ đợi. Xin lôi. 183 00:10:52,140 --> 00:10:56,800 [Cười] Okay. 184 00:11:06,620 --> 00:11:09,970 Hey there. 185 00:11:13,670 --> 00:11:16,310 Khi chúng ta nghĩ về một tập tin - 186 00:11:17,610 --> 00:11:20,710 Khi bạn nghĩ của một tập tin - Được rồi. Cho tôi biết khi bạn đã sẵn sàng. 187 00:11:20,710 --> 00:11:22,520 Oh, tuyệt vời. 188 00:11:22,520 --> 00:11:26,180 Mặc dù đọc từ một Teleprompter có vẻ như không có. Xấu của tôi.