Chào chúng ta đang được theo đòi dõi khóa đào tạo và huấn luyện xây dựng trực tuyến ngữ điệu C++.
Mình tiếp tục trình diễn cho tới chúng ta một trong những thao tác cơ bạn dạng với tệp tin Lúc dùng tủ sách cstdio (trong ngữ điệu xây dựng C), dùng tủ sách này, tất cả chúng ta tiếp tục dùng một con cái trỏ loại FILE thực hiện cầu nối trung gian trá thân ái công tác của tất cả chúng ta và tệp tin, từng thao tác bên trên tệp tin đều nên dùng con cái trỏ loại FILE này. Trong bài học kinh nghiệm này, những các bạn sẽ nằm trong bản thân dò xét hiểu thêm thắt một trong những phương pháp để thao tác với tệp tin bằng phương pháp dùng những stream nhưng mà ngữ điệu C++ cung ứng.
Như bản thân reviews ở bài học kinh nghiệm trước, nhằm thao tác với tệp tin vô ngữ điệu C++, tất cả chúng ta dùng những class như ifstream (file input), ofstream (file output), hoặc fstream (file input/output) và tài liệu sẽ tiến hành tương truyền một cơ hội tuần tự động qua loa những đối tượng người sử dụng của những stream này, nhằm cút vô tệp tin hoặc là đi kể từ tệp tin đi ra công tác.
Bạn đang xem: đọc dữ liệu từ file txt trong c++
File input
Đầu tiên mình thích reviews cho tới chúng ta một trong những thao tác hiểu tài liệu kể từ tệp tin dùng class fstream nhưng mà ngữ điệu C++ cung ứng. Để dùng class này, tất cả chúng ta cần thiết include tệp tin fstream vô tệp tin chương trình:
#include <fstream>
Do class ifstream và ofstream đều được khái niệm phía bên trong tệp tin fstream, nên tất cả chúng ta chỉ việc include tủ sách fstream là rất có thể dùng cả nhị class này.
Bây giờ tất cả chúng ta nằm trong tạo nên một đối tượng người sử dụng tệp tin input nằm trong loại ifstream:
std::ifstream fileInput("C:/Users/ADMIN/Desktop/my_document.txt");
File nhưng mà mình thích hiểu mang tên là my_document.txt
vô folder Desktop bên trên PC của tớ. Class ifstream có không ít cách thức khởi tạo nên không giống nhau, tuy nhiên giản dị nhất là tất cả chúng ta truyền vào trong 1 string là đường đi đúng đắn của tệp tin tất cả chúng ta cần thiết hiểu tài liệu. Nếu tệp tin bại liệt trực thuộc folder nhưng mà công tác được build đi ra thì tất cả chúng ta rất có thể dùng đường đi kha khá.
Bây giờ bản thân tiếp tục đánh giá coi đối tượng người sử dụng fileInput của tớ tiếp tục links được cho tới tệp tin cần thiết cởi hoặc ko bằng phương pháp sau:
if (fileInput.fail())
std::cout << "Failed lớn open this file!" << std::endl;
Phương thức fail tiếp tục trả về false nếu như đối tượng người sử dụng của ifstream ko links cho tới tệp tin được. Và và đúng là nó đang không links được với tệp tin.
Đó là vì vô folder Desktop của tớ chưa xuất hiện tệp tin my_document.txt
này cả. Bây giờ bản thân tạo nên một tệp tin my_document.txt
chưa xuất hiện tài liệu vô folder Desktop, công tác không thể thông tin lỗi gì nữa.
Như chúng ta thấy, tất cả chúng ta dùng những cách thức được khái niệm vô class ifstream, nên tất cả chúng ta chỉ việc dùng thành viên selection operator (.)
nhằm gọi những cách thức tiếp tục khái niệm sẵn.
Một điều tất cả chúng ta cần thiết cảnh báo Lúc thao tác hiểu ghi tệp tin với ngữ điệu C là tất cả chúng ta luôn luôn nên gọi hàm đóng góp tệp tin fclose
ngay trong khi không thể dùng cho tới tệp tin nữa. Đối với những stream xử lý tệp tin vô C++ thì giản dị rộng lớn, Lúc thoát ra khỏi phạm vi khối mệnh lệnh, destructor tiếp tục tự động gọi cách thức close và tệp tin stream tiếp tục tự động hóa đóng góp lại.
Do bại liệt, những chúng ta có thể xử lý như sau (hoặc ko quan trọng cũng được):
std::ifstream input("C:/Users/ADMIN/Desktop/my_document.txt");
if (input.fail())
{
std::cout << "Failed lớn open this file!" << std::endl;
return -1;
}
//read or write data in here
input.close(); //we can forget this line
Bây giờ cho tới phần xử lý hiểu tài liệu kể từ tệp tin, tài liệu kể từ tệp tin tiếp tục truyền qua loa stream vô những phát triển thành vô công tác. Nhưng trước không còn, bản thân cần thiết thêm thắt một trong những tài liệu vô tệp tin my_document.txt
trước. Nội dung của tệp tin my_document.txt
như sau:
1 2 3 4 5
Mình sẽ có được công tác hiểu tài liệu kể từ tệp tin trải qua đối tượng người sử dụng fileInput và in đi ra màn hình hiển thị như sau:
#include <iostream>
#include <fstream>
int main()
{
std::ifstream fileInput("C:/Users/ADMIN/Desktop/my_document.txt");
if (fileInput.fail())
{
std::cout << "Failed lớn open this file!" << std::endl;
return -1;
}
while (!fileInput.eof())
{
int n;
fileInput >> n;
std::cout << n << " ";
}
std::cout << std::endl;
fileInput.close();
return 0;
}
Mình tiếp tục dùng extraction operator (>>) để mang tài liệu kể từ tệp tin vô lưu vô phát triển thành n và tiếp sau đó in đi ra màn hình hiển thị trải qua đối tượng người sử dụng std::cout. Lúc trước, chúng ta nhập tài liệu kể từ keyboard, tài liệu bại liệt sẽ tiến hành lưu trong thời điểm tạm thời vô stdin ở ở đâu đó vô PC, và dùng đối tượng người sử dụng cin để mang tài liệu vô phát triển thành. Bây giờ, tài liệu tiếp tục đã có sẵn vô tệp tin, tất cả chúng ta chỉ việc tạo nên một đối tượng người sử dụng nằm trong loại ifstream và links cho tới tệp tin, tiếp sau đó dùng toán tử (>>) để mang tài liệu vô phát triển thành. Cách sinh hoạt trọn vẹn tương tự động nhau nên không chỉ bạn?
Tuy nhiên, tất cả chúng ta cần phải biết rõ rệt cấu hình tổ chức triển khai tài liệu phía bên trong tệp tin là thế nào nhằm tách những tình huống nước ngoài lệ xẩy ra. Ví dụ bản thân không thay đổi cấu hình công tác như bên trên và sửa lại tệp tin my_document.txt sở hữu nội dung như sau:
1 2 3 4 5 a b c
Thử chạy lại công tác bên trên, công tác tiếp tục rớt vào biểu hiện lặp vô hạn. Đó là vì loại tài liệu nhưng mà tất cả chúng ta lựa chọn nhằm lưu độ quý hiếm hiểu kể từ tệp tin là số nguyên vẹn, tuy nhiên trong tệp tin lại xuất hiện tại những kí tự động. Do bại liệt, Lúc hiểu không còn số nguyên vẹn vô tệp tin, những kí tự động ko thể đi vào phát triển thành n được tự lỗi format, vòng lặp while ko thể kết đốc tự tất cả chúng ta bịa đặt ĐK là hiểu cho tới Lúc kết đốc tệp tin.
Để xử lý biểu hiện này, tất cả chúng ta cần thiết đánh giá tài liệu hiểu kể từ tệp tin đi vào công tác sở hữu đích format hay là không, tất cả chúng ta rất có thể thực hiện như sau:
std::ifstream fileInput("C:/Users/ADMIN/Desktop/my_document.txt");
if (fileInput.fail())
std::cout << "Failed lớn open this file!" << std::endl;
while (!fileInput.eof())
{
int n;
if (fileInput >> n)
std::cout << n << " ";
else
return -2;
}
std::cout << std::endl;
fileInput.close();
system("pause");
return 0;
Nhấn F5 nhằm chạy công tác bên dưới cơ chế Debug, tất cả chúng ta tiếp tục thấy công tác tạm dừng Lúc hiểu đoạn độ quý hiếm 5 và trả về độ quý hiếm -2 mang đến hệ quản lý điều hành. Mình tiếp tục dùng if statement nhằm đánh giá coi extraction operator đã có được tiến hành đích hay là không.
Nếu tất cả chúng ta vẫn ham muốn hiểu toàn cỗ tài liệu vô tệp tin và in đi ra màn hình hiển thị, tất cả chúng ta rất có thể hiểu từng kí tự động vô tệp tin vô phát triển thành loại char, thay cho loại số nguyên:
while (!fileInput.eof())
{
char c;
if(fileInput >> c)
std::cout << c << " ";
}
std::cout << std::endl;
Tiếp theo đòi, tất cả chúng ta nằm trong test hiểu từng dòng sản phẩm tài liệu vô tệp tin vô những đối tượng người sử dụng std::string và in tất cả chúng ta màn hình hiển thị. Mình thay cho thay đổi nội dung tệp tin my_document.txt
trở thành như sau:
This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
Dưới đấy là một cách xử trí nhằm hiểu từng dòng sản phẩm tài liệu và in đi ra mùng hình:
while (!fileInput.eof())
{
char temp[255];
fileInput.getline(temp, 255);
std::string line = temp;
std::cout << line << std::endl;
}
Mình tiếp tục dùng cách thức getline đã có sẵn vô class ifstream nhằm hiểu tài liệu kể từ tệp tin và đem vào trong 1 C-style string sở hữu độ dài rộng thắt chặt và cố định mang đến trước, tiếp sau đó người sử dụng C-style string bại liệt đi vào đối tượng người sử dụng của std::string nhằm tách độ dài rộng bộ lưu trữ dư quá.
Xem thêm: cho 6 điểm trong đó không có 3 điểm nào thẳng hàng số đường thẳng đi qua 2 điểm
Nếu dùng extraction operator (>>) nhằm hiểu tài liệu và std::string thẳng, tất cả chúng ta tiếp tục bắt gặp nên tình huống kí tự động khoảng chừng White ko nắm được như Lúc dùng đối tượng người sử dụng std::cin.
Ngoài một trong những cơ hội hiểu tài liệu kể từ tệp tin trải qua đối tượng người sử dụng của class ifstream nhưng mà bản thân rằng bên trên, tất cả chúng ta còn vô cùng nhiều phương pháp không giống, với thật nhiều cách thức không giống nhưng mà class ifstream tiếp tục hổ trợ. Việc chọn lựa cách này nhằm hiểu tài liệu còn tùy theo cấu hình tài liệu được tổ chức triển khai phía bên trong tệp tin thế nào.
Các chúng ta có thể dò xét hiểu thêm thắt về tủ sách ifstream bên trên đường đi sau:
http://www.cplusplus.com/reference/fstream/ifstream/
File input modes
Cũng tương tự động như thao tác cởi links cho tới tệp tin ở vô ngữ điệu C, tệp tin input stream vô C++ cũng được cho phép tất cả chúng ta lựa chọn loại nhằm cởi tệp tin. Dưới đấy là một trong những mode rất có thể người sử dụng được mang đến tệp tin input stream:
Nếu tất cả chúng ta tạo nên links cho tới tệp tin trải qua đối tượng người sử dụng của class ifstream, mode std::ios::in
được dùng đem quyết định. Tuy nhiên, Lúc dùng tệp tin input/output stream với class fstream thì tất cả chúng ta hãy chọn mode mang đến đối tượng người sử dụng, ví dụ:
std::fstream fileInput("C:/Users/ADMIN/Desktop/my_document.txt", std::ios::in);
if (fileInput.fail())
std::cout << "Failed lớn open this file!" << std::endl;
while (!fileInput.eof())
{
char temp[255];
fileInput.getline(temp, 255);
std::string line = temp;
std::cout << line << std::endl;
}
std::cout << std::endl;
fileInput.close();
Bên cạnh bại liệt, tất cả chúng ta cũng rất có thể cởi tệp tin bên dưới dạng nhị phân:
std::fstream fileInput("C:/Users/ADMIN/Desktop/my_document.txt", std::ios::in | std::ios::binary);
Đọc tài liệu bên dưới dạng nhị phân rất có thể được vận dụng cho tất cả tệp tin nhị phân hoặc tệp tin văn bạn dạng.
Sử dụng một input stream mang đến nhiều file
Cũng như việc tất cả chúng ta tạo nên links cho tới tệp tin với cùng một đường đi ví dụ và dùng cách thức close nhằm đóng góp stream, tất cả chúng ta cũng rất có thể dùng cách thức open sẽ tạo một stream mới mẻ cho tới một đường đi không giống. Ví dụ:
std::ifstream fileInput("C:/Users/ADMIN/Desktop/my_document.txt");
//..............
fileInput.close();
fileInput.open(""C:/Users/ADMIN/Desktop/my_document2.txt"");
//..............
fileInput.close();
Phương thức open sinh hoạt tương tự động cách thức khởi tạo nên của class ifstream, nên tất cả chúng ta rất có thể tạo nên liên kết rất nhiều lần. Tuy nhiên, tất cả chúng ta chỉ rất có thể liên kết cho tới một tệp tin có một không hai bên trên 1 thời điểm. Và trước lúc tạo nên links cho tới tệp tin không giống, tất cả chúng ta nên đóng góp links trước bại liệt.
Tổng kết
Thao tác hiểu tài liệu kể từ tệp tin trải qua những tệp tin input stream nhưng mà C++ cung ứng khá giản dị đối với dùng tủ sách cstdio vô ngữ điệu C. Các chúng ta có thể tìm hiểu thêm thêm thắt nhiều phương pháp hiểu tài liệu kể từ tệp tin không giống qua loa topic bên dưới đây:
Đối với những tình huống cần thiết tàng trữ tài liệu vô tệp tin với nội dung rộng lớn và sở hữu cấu hình, tất cả chúng ta hay sử dụng những format tệp tin như *.xml hoặc *.json... Ngày hiện nay đã có không ít tủ sách hổ trợ mang đến việc hiểu tài liệu cho những format tệp tin này, những chúng ta có thể tìm hiểu thêm thêm thắt bên trên đây:
http://rapidxml.sourceforge.net/index.htm
Một điểm giới hạn nhưng mà tệp tin input stream vô C++ bắt gặp nên là bọn chúng ko tương hỗ hiểu toàn cỗ nội dung vào trong 1 phát triển thành loại struct như hàm fread vô ngữ điệu C. Do bại liệt, nhằm thực hiện được điều này, tất cả chúng ta cần thiết khái niệm lại toán tử (>>) phía bên trong struct hoặc class sở hữu tương quan, phần này sẽ tiến hành trình diễn trong số bài học kinh nghiệm sau.
Hẹn tái ngộ chúng ta vô bài học kinh nghiệm tiếp sau vô khóa đào tạo và huấn luyện xây dựng C++ phía thực hành thực tế.
Mọi chủ ý góp phần hoặc vướng mắc rất có thể bịa đặt thắc mắc thẳng bên trên forums.
www.daynhauhoc.com
Giới thiệu tổng quan liêu khóa học
Nâng cao về phát triển thành, loại dữ liệu
Kiểu tài liệu tự động quyết định nghĩa
Nhập, xuất, streams (Input & Output)
Standard Template Library
Một số feature vô C++11, C++14
Bình luận