2012-05-17 26 views
17
FILE* f = fopen("rajat", "w"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

trả về thành công: "someteis một"fseek không hoạt động khi tập tin được mở trong "a" (append) Chế độ

Nhưng

FILE* f = fopen("rajat", "a"); 
fputs("sometext", f); 
fseek(f, 6, SEEK_SET); 
fputs("is a", f); 
fclose(f); 

Không làm việc. Trả lại "sometextis a"

Mọi ý tưởng tại sao? Giải pháp cho điều này là gì, để mã thứ hai xuất ra chính xác như mã đầu tiên?

+1

Bạn không cần '" w + "' cho cái đầu tiên? Nếu không thì tệp sẽ bị hủy và được tạo lại. –

Trả lời

24

Khi bạn mở ở chế độ nối thêm, con trỏ tệp sẽ được trả về cuối tệp trước mỗi lần ghi. Bạn có thể định vị lại con trỏ với fseek để đọc, nhưng ngay khi bạn gọi một hàm ghi vào tệp, con trỏ sẽ quay trở lại phần cuối của tệp.

Hoặc, đặt theo cách khác, để tránh mất dữ liệu, vị trí của "ghi con trỏ" ghi đè vị trí của "con trỏ đọc". Sau khi nối thêm bất kỳ, con trỏ ghi trả về EOF mới.

Câu trả lời tại this link tham chiếu phần thích hợp của tiêu chuẩn C.

Sử dụng chế độ "w+" nếu bạn muốn ghi vào các vị trí tùy ý trong hồ sơ. Một tệp hiện có sẽ bị ghi đè.

Nếu bạn muốn nối thêm vào tệp hiện có lúc đầu, nhưng sau đó fseek đến vị trí tùy ý, hãy sử dụng "r+" theo sau là fseek(f, 0, SEEK_END).

+0

Nếu bạn không muốn dữ liệu hiện có trong tệp bị hủy, bạn nên sử dụng '" r + "', không phải '" w + "'. –

+0

@JamesKanze Điều này là chính xác, tôi đã làm rõ điểm này trong một chỉnh sửa vài phút trở lại. Một hạn chế cho 'r +' là tệp phải tồn tại. – dasblinkenlight

+0

Tôi luôn thấy rằng hành vi của '" a "' không trực quan. –

Các vấn đề liên quan