Tôi đang đùa giỡn với một số mã đang mở, đọc và sửa đổi tệp văn bản. Một cách nhanh chóng (giản thể) ví dụ sẽ là:Sử dụng "r +" trong fopen trên windows vs linux
#include <stdio.h>
int main()
{
FILE * fp = fopen("test.txt", "r+");
char line[100] = {'\0'};
int count = 0;
int ret_code = 0;
while(!feof(fp)){
fgets(line, 100, fp);
// do some processing on line...
count++;
if(count == 4) {
ret_code = fprintf(fp, "replaced this line\n");
printf("ret code was %d\n", ret_code);
perror("Error was: ");
}
}
fclose(fp);
return 0;
}
Bây giờ trên Linux, biên dịch với gcc (4.6.2) mã này chạy, và sửa đổi dòng thứ 5 của tập tin. Cùng một mã, chạy trên Windows7 được biên dịch với Visual C++ 2010 chạy và tuyên bố đã thành công (báo cáo một mã trả về 19 ký tự và perror
nói "Không có lỗi") nhưng không thay thế được dòng.
Trên Linux tập tin của tôi có quyền truy cập đầy đủ:
-rw-rw-rw- 1 mike users 191 Feb 14 10:11 test.txt
Và như xa như tôi có thể nói nó giống trên Windows:
test.txt (click chuột phải) -> properties -> Bảo mật
"Cho phép" được chọn để đọc & Viết cho người dùng, Hệ thống và Quản trị viên.
Tôi nhận được kết quả tương tự bằng cách sử dụng gcc của MinGW trên Windows để tôi biết đó không phải là tính năng Visual C++ ".
Tôi có thiếu điều gì đó hiển nhiên hay không thực tế là tôi không gặp lỗi, nhưng cũng không có kết quả "tính năng" không sử dụng của r+
với fopen()
trên Windows?
EDIT:
vẻ ngay cả ở Microsoft's site họ nói "r +" nên mở để đọc và văn bản. Họ cũng đã lưu ý:
Khi loại truy cập "r +", "w +" hoặc "a +" được chỉ định, cho phép đọc và ghi (tệp được cho là mở để "cập nhật") . Tuy nhiên, khi bạn chuyển đổi giữa đọc và viết, phải có một thao tác fflush xen kẽ, fsetpos, fseek hoặc tua lại. Vị trí hiện tại có thể được chỉ định cho hoạt động fsetpos hoặc fseek, nếu muốn.
Vì vậy, tôi đã cố gắng:
...
if(count == 4) {
fflush(fp);
ret_code = fprintf(fp, "replaced this line\n");
fflush(fp);
printf("ret code was %d\n", ret_code);
...
vô ích.
Bạn đã thử xả luồng bằng cách sử dụng 'fflush' sau thao tác ghi? – Cyclonecode
Tôi không chắc đó có phải là vấn đề hay không, nhưng bạn có thể cần phải gọi 'fseek' khi chuyển đổi giữa đọc và viết từ tập tin – Hasturkun
@KristerAndersson - yup, chỉ cần cập nhật để làm rõ tôi thấy ghi chú tại trang MSDN nói rằng bạn nên cập nhật các dòng bởi một trong những 'f()' vì vậy tôi đã cố gắng 'fflush()' ing trước và sau khi viết, nhưng không có con xúc xắc. –
Mike