01/10/2018, 17:16

Lỗi mất ký tự khi dùng seekp() trong file Output

Mình có 1 file INPUT.txt nội dung như sau:
Barack Hussein Obama - 04/08/1961 - 10 - 9 - 8
Mình muốn xuất ra file OUTPUT.txt có định dạng:

Information: 
Name: Barack Hussein Obama
Day of birth: 4
Month of birth: 8
Year of birth: 1961
Mark of Math, Physics, Chemistry: 10 9 8

mà có sử dụng lớp seekp() cho file OUTPUT để quay về đầu file in ra từ Information:

Code:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
	fstream File("Date.txt", ios::in);
	string name;
	int day, month, year, Math, Physics, Chemistry;
	getline(File, name, '-');
	name.erase(name.begin() + name.size() - 1);
	File >> day;
	File.seekg(1, ios_base::cur); // .tellg();
	File >> month;
	File.seekg(1, ios_base::cur);
	File >> year;
	File.seekg(3, ios_base::cur);
	File >> Math;
	File.seekg(3, ios_base::cur);
	File >> Physics;
	File.seekg(3, ios_base::cur);
	File >> Chemistry;
	File.close();
	File.open("Result.txt", ios::out);
	File << "Name: " << name << endl;
	File << "Day of birth: " << day << endl;
	File << "Month of birth: " << month << endl;
	File << "Year of birth: " << year << endl;
	File << "Mark of Math, Physics, Chemistry: " << Math << " " << Physics << " " << Chemistry;
	File.seekp(0, ios_base::beg); // .tellp();
	File << "Information: " << endl;
	File.close();
    return 0;
}

Và đây là kết quả thực tế trong file OUTPUT.txt:

Information: 
ssein Obama
Day of birth: 4
Month of birth: 8
Year of birth: 1961
Mark of Math, Physics, Chemistry: 10 9 8

Như các bạn đã thấy là sau khi quay về đầu file OUTPUT bằng seekp() thì một số ký tự đầu file ban đầu bị mất đi. Mình không biết sửa lỗi này thế nào nên bạn nào biết chỉ giúp mình với ạ !

Cảm ơn nhiều!!

Tao Không Ngu. viết 19:29 ngày 01/10/2018

Hi Secret.

  1. Bạn không nên cắt chuỗi bằng con trỏ file như vậy. Rất hại ổ cứng và tốn thời gian.
  2. Cắt chuỗi theo định dạng thì bạn dùng regex.

P/S File -> đọc vào buffer/stream -> đọc từng dòng -> áp regex -> struct.

Secret viết 19:21 ngày 01/10/2018

Bạn không nên cắt chuỗi bằng con trỏ file như vậy.

Mình chưa hiểu bạn nói cắt chuỗi ở chỗ nào?
Nhưng mà cho mình hỏi đoạn code trên sai ở chỗ nào mà file OUTPUT ra bị mất đi vài ký tự, chứ chưa bàn tới cách làm khác!

Trương Tấn Phát viết 19:25 ngày 01/10/2018

Bạn chuyển con trỏ về đầu tập tin thì nó sẽ GHI ĐÈ nội dung trước đó.
Nên nhớ là ghi tập tin thì chỉ có GHI ĐÈ và NỐI TIẾP chứ không có CHÈN đâu nhé.

Tao Không Ngu. viết 19:32 ngày 01/10/2018

Hi Secret.

  1. Ý mình là chỗ bạn đọc file. Khi muốn đọc tháng xong để bỏ dấu “/” thì bạn lại nhảy seekg. Khi không muốn đọc một ký tự nào bạn dùng seekg để bỏ qua nó.
  2. FIle gần giống như mảng khi bạn dịch con trỏ đi ghi xuống thì nó sẽ ghi đè cái cũ.
Bài liên quan
0