Cách đọc từ tệp trong C ++ – đọc tệp bằng 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ệp bằng 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  Cách vẽ một vòng tròn bằng CSS - css nền trắng hình tròn

Đọ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  Cách căn giữa văn bản theo chiều dọc với CSS - căn chỉnh dọc văn bản css

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  Các hàm tự gọi trong JavaScript - tự gọi hàm js

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ệp bằng c ++

Tệp trong C++, đồng bộ tệp văn bản và vào ra chuẩn

  • Tác giả: TIN 123
  • Ngày đăng: 2021-08-20
  • Đánh giá: 4 ⭐ ( 5351 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tệp trong C++, đồng bộ tệp văn bản và vào ra chuẩn.
    Để đọc và ghi dữ liệu dạng này ta thường sử dụng hai lệnh sau:
    • Với cú pháp freopen(“dulieu.inp”,”r”,stdin); thì sẽ đồng bộ việc đọc dữ liệu từ bàn phím với việc đọc dữ liệu từ file có tên dulieu.inp, đặc tả “r” dùng để mở file dulieu.inp với mục đích để đọc dữ liệu.
    • Với cú pháp freopen(“ketqua.out”,“w”,stdout); thì sẽ đồng bộ việc ghi dữ liệu ra màn hình với việc ghi dữ liệu vào file có tên ketqua.out, đặc tả “w” dùng để mở file ketqua.out với mục đích để ghi dữ liệu.

Đọc từng dòng tệp bằng cách sử dụng ifstream trong C ++

  • Tác giả: qastack.vn
  • Đánh giá: 5 ⭐ ( 9196 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] Đầu tiên, tạo một ifstream: #include std::ifstream infile(“thefile.txt”); Hai phương pháp tiêu chuẩn là: Giả…

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

  • Tác giả: vietjack.com
  • Đánh giá: 3 ⭐ ( 7578 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

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

  • Tác giả: ironhackvietnam.edu.vn
  • Đánh giá: 5 ⭐ ( 1182 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!

Đọc ghi file trong C

  • Tác giả: freetuts.net
  • Đánh giá: 4 ⭐ ( 6028 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài này chúng ta sẽ tìm hiểu cách đọc ghi file trong C bằng cách sử dụng các hàm xử lý file: fprintf(), fscanf(), fread(), fwrite(), fseek().

10.2 Một số thao tác đọc dữ liệu từ File trong C++

  • Tác giả: cpp.daynhauhoc.com
  • Đánh giá: 5 ⭐ ( 6461 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: if (input.fail()) { std::cout << "Failed to open this file!" << std::endl; return -1; } //read or write data in here…

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á: 4 ⭐ ( 3077 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.

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