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

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 từ tệp c ++

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  Bộ chọn CSS cho phần tử đầu tiên có lớp - bộ chọn css phần tử lớp

Đọ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  Hộp cửa sổ bật lên HTML [Thiết kế cửa sổ bật lên tốt nhất từ ​​trước đến nay] - bật lên trang web html

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.

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.

Xem Thêm  Đối tượng ngày trong JavaScript - loại javascript ngày

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 từ một tệp c ++

cách đọc và ghi file trong c++ đơn giản và dể hiểu nhất

  • Tác giả: TechDev TV
  • Ngày đăng: 2016-05-15
  • Đánh giá: 4 ⭐ ( 2482 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: cách hướng dẫn đọc và ghi file trong c c++ đơn giản , đọc file .txt
    ghi file .txt

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 ⭐ ( 7534 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ách đọc và ghi vào tệp trong C ++

  • Tác giả: vi.softoban.com
  • Đánh giá: 3 ⭐ ( 4661 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tệp rất quan trọng trong lập trình thế giới thực. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách sử dụng các thao tác tệp khác nhau trong ngôn ngữ lập trình C ++.

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

  • Tác giả: gameviethot.com
  • Đánh giá: 4 ⭐ ( 8155 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Chào các bạn đang theo dõi khóa học lập trình trực tuyến ngôn ngữ C++, Mình đã trình bày đến các bạn một số thao tác cơ bản với file khi sử dụng thư viện cstdio (trong ngôn ngữ lập trình C), sử dụng thư viện này, chúng ta sẽ sử dụng một con trỏ kiểu FILE làm cầu nối trung gian giữa chương trình của chúng ta và file, mọi thao tác trên file đều phải sử dụng con trỏ kiểu FILE này

Lập Trình C++: Đọc Ghi Dữ Liệu Trong C++

  • Tác giả: phattrienphanmem123az.com
  • Đánh giá: 4 ⭐ ( 9517 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Học Lập Trình C++, đọc ghi dữ liệu trong c++, đọc file ghi file dữ liệu trong c++ là một kỹ thuật chia sẻ các đọc dữ liệu ghi dữ liệu vào file trong c++

Bài 01 : Xử lý vào/ ra trên file văn bản ở C/C++

  • Tác giả: kcntt.duytan.edu.vn
  • Đánh giá: 5 ⭐ ( 3035 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Đối với các em sinh viên  CNTT, thực hiện đồ án cơ sở ngành, thường lúng túng khi  giáo viên yêu cầu xử lý đầu vào cho bài toán trên file với ngôn ngữ C/C++.Trong bài viết này, tôi sẽ cung cấp các em một số kiến thức cơ bản khi xử lý file với ngôn ngữ C/C++.

    Trong C/C++, khi thao…

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

  • Tác giả: hoclaptrinh.vn
  • Đánh giá: 3 ⭐ ( 2626 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Chương này sẽ hướng dẫn bạn cách đọc và ghi một file. Điều này cần một Thư viện chuẩn C++ khác là fstream, mà định nghĩa 3 kiểu dữ liệu mới:

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