Cách đọc từ tệp trong C ++ – đọc c ++ từ tệp

Trong bài viết này, chúng ta sẽ xem xét các luồng C ++, xử lý tệp và ba phương pháp khác nhau để đọc dữ liệu từ tệp vào chương trình C ++.

Bạn đang xem : đọc c ++ từ tệp

Trong hành trình lập trình của mình, sẽ có lúc bạn muốn bắt đầu làm việc với dữ liệu trong thế giới thực. Loại dữ liệu này thường được lưu trữ trong các tệp trên đĩa. Vì việc đọc từ các tệp liên quan đến việc tương tác với hệ điều hành của bạn, nó tương đối phức tạp. Trong bài viết này, chúng ta sẽ xem xét các luồng C ++, xử lý tệp và ba phương pháp khác nhau để đọc dữ liệu từ tệp vào chương trình C ++.

Nếu bạn đến từ một ngôn ngữ lập trình cấp cao như Python , thì việc đọc tệp vào chương trình có vẻ như là một nhiệm vụ đủ đơn giản. Bạn mở tệp, đọc nội dung của nó và đóng nó. Làm việc với một tệp có thể chiếm một hoặc hai dòng mã của bạn. Trong C ++, quy trình đọc tệp phức tạp hơn một chút – có thêm bước đọc đến hoặc từ đối tượng luồng. Để hiểu cách các chương trình C ++ của chúng ta tương tác với các tệp, bây giờ chúng ta hãy xem xét khái niệm luồng trong C ++.

Luồng C ++ là gì?

Các luồng C ++ là các giao diện để xử lý đầu vào và đầu ra giống như trình tự. Nếu trước đây bạn đã viết chương trình “Hello World” bằng C ++ thì bạn đã làm việc với các luồng. Hãy cùng tìm hiểu sơ qua về cách nhìn của nó:

  std :: cout & lt; & lt; "Xin chào Thế giới! \ N";  

Trong ví dụ này, chúng tôi truyền đối tượng chuỗi của mình vào luồng đầu ra ký tự (viết tắt là “cout”). cout là một phần của thư viện iostream và là một phiên bản của lớp luồng đầu ra tổng quát hơn (“ostream”). lớp chị em của ostream là “istream”, một lớp để xử lý các luồng đầu vào.

Khi làm việc với tệp, chúng tôi sử dụng một lớp con khác của luồng: lớp fstream (dành cho luồng tệp) bao gồm ifstream cho đầu vào và ofstream cho đầu ra cho tệp. Đối với ví dụ này, chúng tôi sẽ làm việc với ifstream vì chúng cho phép chúng tôi đọc từ một tệp.

Xử lý tệp trong C ++

Để đọc chuỗi ký tự từ tệp văn bản, chúng tôi cần thực hiện các bước sau:

  1. Tạo một đối tượng luồng.
  2. Kết nối nó với một tệp trên đĩa.
  3. Đọc nội dung của tệp vào đối tượng luồng của chúng tôi.
  4. Đóng tệp.

Các bước mà chúng tôi kiểm tra chi tiết bên dưới, đăng ký theo hành động “xử lý tệp”. Ở mỗi giai đoạn, đối tượng luồng của chúng tôi có thể chiếm các trạng thái khác nhau, chúng tôi có thể kiểm tra trạng thái này bằng cách sử dụng các chức năng thành viên sau:

  • bad () trả về True nếu xảy ra lỗi khi đọc từ hoặc ghi vào luồng. Nếu một luồng là “không hợp lệ” thì không thể thực hiện thêm các thao tác liên quan đến luồng.
  • fail () trả về giá trị True nếu xảy ra lỗi, nhưng chúng tôi vẫn có thể vận hành trên luồng.
  • eof () trả về True nếu đạt đến cuối tệp (EOF), ngược lại trả về False.
  • good () trả về True nếu mỗi trạng thái trong ba trạng thái còn lại là false, tức là luồng không bad cũng như không thành công, cũng như nó chưa đến cuối tệp.

Một phương thức quan trọng khác được cung cấp bởi is_open (). Nó đánh giá là True nếu một đối tượng luồng đang mở. Bây giờ cuối cùng chúng ta hãy tập hợp tất cả các thành phần lại với nhau và đọc trong một tệp bằng C ++.

Xem Thêm  Tập trung vào các kiểu lấy nét | Thủ thuật CSS - kiểu lấy nét đầu vào css

Đọc tệp trong C ++

Giả sử chúng tôi có danh sách mua sắm được lưu trữ trong tệp .txt:

  trứng
giăm bông
trứng và thư rác
thư rác và trứng  

Mục tiêu của chúng tôi là in nội dung của danh sách vào bảng điều khiển. Trước khi chúng tôi bắt đầu viết chương trình của mình, hãy bao gồm các tệp tiêu đề có liên quan:

  #include & lt; iostream & gt;
#include & lt; fstream & gt;
#include & lt; string & gt;  

Bây giờ chúng tôi đã sẵn sàng để viết hàm của mình. Trước tiên, hãy khai báo biến fstream của chúng ta và kết nối nó với một đối tượng luồng bằng cách mở tệp:

  int main () {
std :: ifstream myfile; myfile.open ("shopping_list.txt");  

Nói đúng ra, chúng tôi có thể thực hiện hành động đó trong một dòng duy nhất, sử dụng hàm tạo lớp để mở tệp trực tiếp khi khởi tạo đối tượng luồng:

  int main () {
std :: ifstream myfile ("shopping_list.txt"); // điều này tương đương với phương thức trên  

Trước khi chúng tôi có thể đọc nội dung của tệp trong luồng của mình, tất cả những gì còn lại cần làm là khai báo một biến chuỗi có thể chứa nội dung:

  std :: string mystring;  

Đọc tệp trong C ++ bằng & gt; & gt; Nhà điều hành

Đối với người mới bắt đầu, hãy sử dụng toán tử nhập luồng & gt; & gt; để đọc trong danh sách của chúng tôi từ tệp.

 if (myfile.is_open ()) {// luôn kiểm tra xem tệp đã mở chưa
myfile & gt; & gt; dây thần kinh; // chuyển nội dung của tệp vào luồng
std :: cout & lt; & lt; dây thần kinh; // nội dung của luồng chuyển sang đầu ra chuẩn
}  

Lưu ý rằng hàm hủy ifstream tự động đóng tệp của chúng tôi, đây là một trong những đặc quyền khi sử dụng lớp này. Nếu muốn, chúng ta có thể thêm lệnh infile.close () vào cuối chương trình. Đây được coi là phương pháp hay, nhưng nó không thực sự mang lại bất kỳ giá trị nào.

Khi chúng tôi chạy chức năng đó, đây là kết quả mà chúng tôi nhận được trên màn hình:

  trứng  

Đó không phải là những gì chúng tôi mong đợi. Chức năng của chúng tôi chỉ in mục đầu tiên trong danh sách mua sắm của chúng tôi. Đó là vì & gt; & gt; toán tử chỉ đọc một chuỗi cho đến khi nó gặp một ký tự khoảng trắng (chẳng hạn như dấu cách hoặc ngắt dòng). Để đọc toàn bộ tệp, chúng ta có thể đặt dòng vào vòng lặp while:

  if (myfile.is_open ()) {while (myfile.good ()) {
myfile & gt; & gt; dây thần kinh;
std :: cout & lt; & lt; dây thần kinh;
}}  

Khi chúng tôi đến cuối tệp, myfile.good () đánh giá là Sai, khiến vòng lặp while kết thúc. Chúng ta có thể viết tắt điều kiện như sau:

  while (myfile) { 

Điều này tương đương với việc hỏi xem tệp của chúng tôi có tốt không. Mã của chúng tôi hiện hoạt động như thế nào?

  egghameggsandspamspamandeggseggs  

Hai điều đã xảy ra ở đây: Tất cả các mặt hàng mua sắm của chúng tôi được gắn với nhau, với mặt hàng cuối cùng được in hai lần. Mặc dù phần sau liên quan đến cách C ++ xử lý dữ liệu được đệm và nằm ngoài phạm vi của hướng dẫn này, phần đầu tiên được mong đợi. Rốt cuộc, & gt; & gt; bỏ qua khoảng trắng, nghĩa là tất cả các ký tự khoảng trắng và dòng mới đều bị mất. Làm thế nào chúng ta có thể đưa thông tin đó vào đầu ra? Câu trả lời cho câu hỏi đó nằm trong hàm get ().

Đọc tệp trong C ++ bằng get ()

Chúng tôi sẽ thay thế & gt; & gt; với hàm get (), một hàm thành viên của lớp fstream của chúng ta có thể đọc từng ký tự một. Điều tuyệt vời về get () là nó không bỏ qua khoảng trắng và thay vào đó coi nó như một chuỗi các ký tự bình thường. Để đọc toàn bộ nội dung của tệp, chúng tôi sẽ tuân theo vòng lặp trong khi của chúng tôi:

  if (myfile.is_open ()) {
char mychar;
trong khi (myfile) {
mychar = myfile.get ();
std :: cout & lt; & lt; mychar;
}
}  

Hiện tại, đầu ra của tập lệnh nhỏ của chúng ta trông như thế nào?

  trứng
giăm bông
trứng và thư rác
thư rác và trứng  

Thành công! Toàn bộ danh sách mua sắm của chúng tôi đã được in ra bảng điều khiển. Để chứng minh rằng chức năng này thực sự phát trực tiếp từng ký tự một, hãy thêm một chức năng nhỏ cho chúng ta biết vị trí của con trỏ của luồng sau mỗi đầu ra.

  std :: cout & lt; & lt; ":" & lt; & lt; myfile.tellg () & lt; & lt; ",";  

Tên của hàm Tellg () là viết tắt của “tell get”. Nó trả về vị trí hiện tại của con trỏ khi nó di chuyển qua luồng đầu vào. Khi toàn bộ tệp đã được duyệt qua, tellg () trả về giá trị -1.

Xem Thêm  Tổng quan về hàm phân biệt số đếm trong SQL - đếm với phân biệt trong sql

Hãy chỉ xem hai dòng đầu tiên của đầu ra sau khi chạy mã đã sửa đổi:

  e: 2, g: 3, g: 4, s: 5,
: 6, h: 7, a: 8, m: 9,  

Đối với mọi hành động get (), đầu ra chuẩn hiển thị chữ cái của đầu vào và vị trí của con trỏ. Chúng ta có thể thấy rằng mọi ký tự thực sự đã được xử lý riêng lẻ, khiến mã đánh giá vị trí của con trỏ sau mỗi ký tự, có thể là một chữ cái hoặc khoảng trắng.

Đọc tệp trong C ++ bằng getline ()

Đối với trường hợp sử dụng của chúng tôi, có một số điểm nhỏ trong việc xử lý từng ký tự riêng biệt – sau cùng, chúng tôi muốn in từng dòng từ danh sách mua sắm của mình lên màn hình. Hàm này gọi hàm getline (), một hàm thành viên khác, hàm này đọc trong văn bản cho đến khi nó gặp sự cố ngắt dòng. Đây là cách chúng tôi sẽ sửa đổi mã của mình:

  std :: string myline;
if (myfile.is_open ()) {
trong khi (myfile) {
std :: getline (myfile, myline);
std :: cout & lt; & lt; myline & lt; & lt; ":" & lt; & lt; myfile.tellg () & lt; & lt; '\N';
}
}  

Và đây là kết quả:

  trứng: 5
giăm bông: 9
trứng và thư rác: 23
thư rác và trứng: 37  

Vị trí của con trỏ hiện được đánh giá sau mỗi dòng được luồng tệp của chúng tôi đọc.

Để tóm tắt mọi thứ, đây là phiên bản cuối cùng của tập lệnh của chúng tôi để đọc từng dòng một tệp trong C ++:

 #include & lt; iostream & gt;
#include & lt; fstream & gt;
#include & lt; string & gt;

int main () {
std :: ifstream myfile;
myfile.open ("shopping_list.txt");
std :: string myline;
if (myfile.is_open ()) {
while (myfile) {// tương đương với myfile.good ()
std :: getline (myfile, myline);
std :: cout & lt; & lt; myline & lt; & lt; '\N';
}
}
khác {
std :: cout & lt; & lt; "Không thể mở tệp \ n";
}
trả về 0; }  

Thêm một điều kiện khác, như chúng tôi đã làm ở cuối tập lệnh này, là một ý tưởng hay nếu bạn gặp phải tệp có vấn đề. Thay vì chỉ kết thúc một cách đơn giản, tập lệnh sẽ cho bạn biết rằng tập lệnh không thể mở tệp.

Đọc tệp bằng C ++ bằng cách đọc tệp kiểu C

Cũng như nhiều khía cạnh về ngôn ngữ C ++, chúng ta có một lớp khác để đọc và ghi vào các tệp là phần còn lại của C, người tiền nhiệm của nó. Luồng kiểu C được mã hóa trong các đối tượng FILE từ thư viện cstdio. stdin và stdout là các biểu thức của loại FILE * để xử lý các luồng đầu vào và đầu ra tương ứng.

Xem Thêm  Cách đặt xác thực độ dài tối thiểu trong HTML5 - độ dài tối thiểu của biểu mẫu html

Với cách đọc tệp kiểu C, điểm khác biệt quan trọng nhất đối với lớp fstream là các đối tượng FILE * không đóng tệp cho bạn: Nếu bạn quên đóng tệp của mình, tệp sẽ vẫn mở. Đó là lý do tại sao những người ủng hộ lớp fstream cho rằng sử dụng an toàn hơn.

Học để trở thành nhà phát triển C ++

Học cách đọc dữ liệu từ một tệp vào chương trình của bạn là một bước quan trọng đối với bất kỳ lập trình viên C ++ nào có nguyện vọng. Nhưng đó chỉ là một phần của phương trình.

Khóa học của chúng tôi được thiết kế để biến bạn thành nhà phát triển C ++. Bạn sẽ học các khái niệm lập trình cốt lõi trong khi thực hiện năm dự án trong thế giới thực.

Hãy đăng ký chương trình Nanodegree C ++ của Udacity ngay hôm nay!

Bắt đầu học


Xem thêm những thông tin liên quan đến chủ đề đọc c ++ từ tệp

C++ Tutorial – 24 – Reading From a File

  • Tác giả: thenewboston
  • Ngày đăng: 2009-06-13
  • Đánh giá: 4 ⭐ ( 3241 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Join our community below for all the latest videos and tutorials!

    Website – https://thenewboston.com/
    Discord – https://discord.gg/thenewboston
    GitHub – https://github.com/thenewboston-developers
    Reddit – https://www.reddit.com/r/thenewboston/
    LinkedIn – https://www.linkedin.com/company/thenewbostoncoin/
    Facebook – https://www.facebook.com/thenewbostoncoin/
    Twitter – https://twitter.com/thenewboston_og
    Instagram – https://www.instagram.com/thenewbostoncoin/
    Twitch – https://www.twitch.tv/thenewboston/videos

    TNBC Donations: b6e21072b6ba2eae6f78bc3ade17f6a561fa4582d5494a5120617f2027d38797

Đọc ma trận từ file trong C++ và kiểm tra ma trận đường chéo

  • Tác giả: nguyenvanhieu.vn
  • Đánh giá: 5 ⭐ ( 2975 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Yêu cầu của đề bài là đọc ma trận từ file sử dụng C++ và sau đó kiểm tra xem ma trận đó có phải ma trận đường chéo không?

Hướng dẫn thao tác với File trong C

  • Tác giả: ironhackvietnam.edu.vn
  • Đánh giá: 4 ⭐ ( 1368 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Ironhack hướng dẫn bạn chi tiết từng thao tác làm việc file trong C: đọc chuỗi, ghi file bằng hàm fwrite, fread trong C,.. Đọc ngay!

Hàm Fgets Đọc Chuỗi Từ File Trong C++, Đọc Ghi File Trong C

  • Tác giả: hutgiammo.com
  • Đánh giá: 3 ⭐ ( 9152 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: It-Pro Training Xử lý dữ liệu tệp văn bản – Lập trình C : Bài 18 Xử lý dữ liệu tệp văn bản – Lập trình C : Bài 18 Xửlý dữ liệu tệp văn bản – Lập trình C : Bài 181, Giới thiệuDữ liệu file văn bản bao gồm một tập hợp các chuỗi kýtự và văn bản được tổ chức thành dòng

Hướng dẫn cách đọc từ các tệp trong C bằng Fread

  • Tác giả: box.edu.vn
  • Đánh giá: 5 ⭐ ( 1554 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Để giúp các bạn có thể đọc từ các tệp trong C bằng Fread một cách chính xác nhất thì hôm nay chúng tôi sẽ giới thiệu chi tiết về C và các quy tắc dùng Fread.

Đọc/ghi File trong C++ | fstream trong c++

  • Tác giả: vietjack.com
  • Đánh giá: 4 ⭐ ( 4261 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Đọc/ghi File trong C++ | fstream trong c++ – Học C++ cơ bản và nâng cao cho người mới học từ Ngôn ngữ C++ hướng đối tượng, Cú pháp cơ bản, Biến, Hàm, Kiểu dữ liệu, Tính kế thừa, Nạp chồng, Tính đa hình, Tính bao đóng, Xử lý ngoại lệ, Template, Overriding, Toán tử, Vòng lặp, Điều khiển luồng, Interface, Thư viện STL, Iterator, Con trỏ, Mảng, Exception Handling, Overloading, Namespace, Thư viện chuẩn C++ và Signal Handling

Đọc ma trận từ file trong C++

  • Tác giả: www.laptrinhx.com
  • Đánh giá: 5 ⭐ ( 3628 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình