2010-05-06 33 views
8

Mỗi lần đọc trong fstream, tôi có thêm 1 ký tự ở cuối, Làm cách nào để tránh điều này?C++: Mỗi khi tôi đọc bằng fstream, tôi có thêm 1 ký tự ở cuối

EDIT:

ifstream readfile(inputFile); 
ofstream writefile(outputFile); 
char c; 
while(!readfile.eof()){ 
     readfile >> c; 
     //c = shiftChar(c, RIGHT, shift); 
     writefile << c; 
} 
readfile.close(); 
writefile.close(); 
+3

bài mã gây ra vấn đề. Tôi woulkd đoán rằng bạn đã mở tập tin trong chế độ văn bản (chứ không phải là nhị phân) và đang cố gắng đọc nó với read(), nhưng ai biết được. –

+0

Mã thực tế sẽ hữu ích. Đây có phải là ký tự dòng mới ('\ n') không? – Dima

+1

Xin lỗi các bạn, chỉ cần cập nhật bài viết của tôi –

Trả lời

6

này thường là kết quả của thử nghiệm cho đến cuối tập tin không chính xác. Bạn thường muốn làm một cái gì đó như:

while (infile>>variable) ... 

hay:

while (std::getline(infile, whatever)) ... 

nhưng KHÔNG:

while (infile.good()) ... 

hay:

while (!infile.eof()) ... 

Edit: Hai đầu tiên làm một đọc, kiểm tra xem nó có thất bại hay không và nếu có, hãy thoát khỏi vòng lặp. Sau hai lần thử đọc, xử lý những gì đã được "đọc", và sau đó thoát khỏi vòng lặp trên lặp lại tiếp theo nếu lần thử trước đó thất bại.

Edit2: sao chép một tập tin vào một cách dễ dàng, xem xét sử dụng một cái gì đó như thế này:

// open the files: 
ifstream readfile(inputFile); 
ofstream writefile(outputFile); 

// do the copy: 
writefile << readfile.rdbuf(); 
+0

Bạn có thể giải thích lý do tại sao 2 câu cuối là sai? –

+0

tuyệt vời !! giải quyết vấn đề. U có thể giải thích tại sao '.eof()' không phải là một ý tưởng hay? –

+0

Xem chỉnh sửa đầu tiên của anh ấy. –

0

Dựa trên mã, dường như những gì bạn đang cố gắng làm là sao chép nội dung của một file khác ?

Nếu vậy, tôi muốn thử một cái gì đó như thế này:

ifstream fin(inputFile, ios::binary); 

fin.seekg(0, ios::end); 
long fileSize = fin.tellg(); 
fin.seekg(0, ios::beg); 

char *pBuff = new char[fileSize]; 
fin.read(pBuff, fileSize); 
fin.close(); 

ofstream fout(outputFile, ios::binary) 
fout.write(pBuff, fileSize); 
fout.close; 
delete [] pBuff; 
Các vấn đề liên quan