Tổng hợp: đọc file bằng C++ và C
Mình tìm thấy nhiều cách đọc file bằng C++ vào std::string khác nhau, post tạm 1 cách đã, có thời gian post dần thêm.
Cách đầu tiên là đọc file bằng istreambuf_iterator. Ví dụ cụ thể:
File text.txt lưu với nội dung như sau:
nguyen chiem minh vu
01216558383
(EOF)
Và đọc file như vầy:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream textfile("text.txt");
string s1; //store a line of file
for(istreambuf_iterator<char,char_traits<char> > it(textfile.rdbuf());
*it != '
'; it++) {
s1 += *it; //append at end of string
}
cout << s1.data() << endl;
return 0;
}
Output:
nguyen chiem minh vu
Giả sử các bạn thay cái phần đọc file vào string thành như sau:
for(istreambuf_iterator<char,char_traits<char> > it(textfile.rdbuf());
it != istreambuf_iterator<char,char_traits<char> >(); it++) {
s1 += *it; //append at end of string
}
Thì output sẽ là:
nguyen chiem minh vu
01216558383
Phần trên là một trong số những cách đọc file trong C++, bữa khác mình post thêm.
Tiếp theo là sử dụng lớp stringstream để đọc nội dung file text.txt nội dung như ở trên:
File text.txt:
nguyen chiem minh vu
01216558383
(EOF)
Và đọc file như sau:
Output:
nguyen chiem minh vu
01216558383
Đây cũng là một cách để hốt toàn bộ kí tự trong file vào string.
Cách tiếp theo là các bạn khởi tạo giá trị cho constructor của class string luôn.
Cũng file text.txt cùng nội dung như ở trên, ta đọc file như sau:
Output:
nguyen chiem minh vu
01216558383
Nếu các bạn không muốn dùng constructor, thì có thể thay lại như sau:
Kết quả vẫn tương tự như ở trên.
Sau một hồi đọc file vào string theo kiểu màu mè, thì bây giờ trở lại với kiểu cổ điển vậy
File text.txt:
nguyen chiem minh vu
01216558383
Đọc file:
Nội dung in ra là toàn bộ file. Vậy muốn đọc từng dòng thì nàm thao? Không rõ đọc vào std::string thì thế nào, thôi thì đọc tạm vào kiểu char[] vậy
Thông thường các bạn đọc file bằng vòng lặp while như trên hay dùng điều kiện là:
Thì sẽ in ra thừa 1 dòng trống, do nó đọc riêng kí tự EOF vào temp một lần nữa. Dùng cách ở trên kia sẽ không bị đọc thừa.
Còn sót mất kiểu đọc file trong C++ nào không anh @ltd nhỉ?
Mấy cách em liệt kê ra ở đây anh cũng không biết hết
C++ chán rồi giờ về lại C phát, do lâu rồi không dùng nên có sót thì nhờ thánh C @ltd bổ sung phát.
Đầu tiên là cách múc toàn bộ file text vào xâu kí tự. Giả sử file text như sau:
nguyen chiem minh vu
0121 655 8383
(EOF)
Đọc file như sau:
Vậy là xâu s khi in ra sẽ có nội dung như sau:
nguyen chiem minh vu
0121 655 8383
Nghĩa là toàn bộ kí tự trong file đã được hốt vào xâu.
Nếu chỉ muốn đọc một dòng, thì thay dòng fscanf thành như sau:
hoặc
Tiếp đến là kiểu đọc toàn bộ file nhưng in ra từng dòng.
File text nội dung như sau:
nguyen chiem minh vu
0121 655 8383
nguyenchiemminhvu@gmail.com (EOF)
Đọc file như sau:
Result:
Test thử đọc file (chỉ đọc số nguyên) trong C++ phát:
File text.txt:
nguyen chiem minh vu
0121 655 8383
nguyenchiemminhvu@gmail.com
Nội dung in ra:
Thử chuyển code trên từ C++ qua C xem thế nào:
Code block báo lỗi segment fault rồi anh @ltd ơi
Segment fault là do vòng while trong sscanf nó không chịu dừng lại
I moved 3 posts to an existing topic: Off-topic will be moved here
Cho e hỏi cách đọc file thỏa mãn dữ liệu đầu vào như sau :Dòng 1 ghi số bộ test, mỗi bộ test ghi trên 1 dòng xâu ký tự họ tên
VD có dữ liệu file:
3
Nguyen Van Nam
Do Van A
Tran Thi B
Trong C bạn có những hàm như fgetc, fgets… để đọc 1 kí tự, đọc 1 xâu, hay fscanf để đọc 1 định dạng nào đó. Cái gì cần đọc trước thì định dạng trước.
http://www.tutorialspoint.com/c_standard_library/c_function_fscanf.htm
Bạn coi người ta làm rồi làm theo.
lêu lêu, C thì ko cấp phát bằng new ạ. lêu lêu…
Bị phát hiện rồi, phải flag để bịt đầu mối mới được
Em chào anh. Anh ơi anh có thể chỉ em cách làm đọc 1 file như sau:
Tran Trinh Quoc Viet 1552005 7,8 8,9 6,7
Trong đó Ten : Tran Trinh Quoc Viet
MSSV 1552005 . 2 cái này là kiểu char[255]
Còn 7,8 8,9 6,7 là điểm toán lý hoá kiểu float.
Bây giờ em muốn đọc file này xong tính toán toán ra điểm trung bình của toán lý hoá thì em phải làm sao hả anh. Anh có thể giới thiệu hàm hoặc cách làm cho em được không ?
Cho em hỏi. nếu mình đọc file bằng getline và stringstream thì khi gặp dòng trống thì làm cách nào để mình lược bỏ nó đi