我正在打開一些正在打開,閱讀和修改文本文件的代碼。快速(簡體)的例子是:使用「r +」在fopen上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;
}
現在在Linux上,與海灣合作委員會(4.6.2)運行此代碼編譯,並修改文件的5日線。使用Visual C++ 2010編譯的Windows7上運行的相同代碼運行並聲稱已成功(報告返回碼爲19個字符,而perror
表示「無錯誤」),但未能替換該行。
在Linux上我的文件具有完全的權限:
-rw-rw-rw- 1 mike users 191 Feb 14 10:11 test.txt
而據我可以告訴它是相同的Windows:
的test.txt(右鍵) - >屬性 - >安全
檢查「允許」爲讀取&寫入用戶,系統和管理員。
我在Windows上使用MinGW的gcc獲得了相同的結果,所以我知道它不是一個Visual C++「功能」。
我失去了一些東西明顯,或者是我沒有得到任何錯誤的情況,也沒有輸出只使用r+
與fopen()
在Windows上的無證「功能」?
編輯:
似乎即使在Microsoft's site他們說 「R +」 應該打開閱讀和書面方式。他們還提出了這樣一個字條:
當「R +」,「W +」,或「+」訪問類型指定,閱讀和寫作都被允許(該文件被認爲是開放的「更新」) 。但是,當您在讀取和寫入之間切換時,必須存在干預fflush,fsetpos,fseek或倒帶操作。如果需要,可以爲fsetpos或fseek操作指定當前位置。
所以,我想:
...
if(count == 4) {
fflush(fp);
ret_code = fprintf(fp, "replaced this line\n");
fflush(fp);
printf("ret code was %d\n", ret_code);
...
無濟於事。
您是否在寫入操作之後嘗試使用'fflush'刷新流? – Cyclonecode 2013-02-14 15:47:36
我不確定這是否是問題,但您可能需要在文件 – Hasturkun 2013-02-14 15:48:47
@KristerAndersson - yup之間切換讀取和寫入時調用'fseek',只是更新以澄清我在MSDN網站上看到說你的註釋應該更新'f()'之一的流,所以我在寫入之前和之後嘗試了'fflush()',但沒有骰子。 –
Mike
2013-02-14 15:51:46