2013-08-31 70 views
5

有沒有辦法說明FILE *打開的模式?確定FILE *是否可寫

具體而言,我需要告訴一個文件流是否可寫。無論是可寫的真假結果,還是模式本身的良好結果。

+2

有沒有標準的方法來做到這一點,但大多數平臺會讓你這樣或那樣做。如果你不想完全跨平臺(或者不介意針對不同平臺有不同的代碼),你應該指定你的操作系統,你可能會得到一個體面的答案。 – zneak

回答

2

一般來說,沒有沒有。您需要自己跟蹤這些信息。您可能能夠嘗試寫入文件並獲得錯誤或成功,但這取決於您正在嘗試執行的操作。

3

沒有直接回答你的問題,但你可以使用freopen

FILE *freopen(const char *path, const char *mode, FILE *stream); 

它打開一個指定的流指定的文件,先關閉流,如果它已經 開放。如果流先前具有方向,則freopen將清除它。

3

是的,有辦法,但他們是歷史性的,並被別人皺起了眉頭。此外,您需要研究/測試確切的值,然後承擔新的操作系統版本將撤銷您的假設的風險。

無論如何,考慮到這一點,您可以測試FILE結構中的特定值的字段。該結構位於stdio.h中,感興趣的領域是:_flag和_file。

寫了一些特徵代碼,並在系統上運行,如:

#include <stdio.h> 

main() 
{ 
    FILE *fp; 

    fp = fopen("test1.txt", "r"); 
    printf("(r) _flag = %04x, _file = %04x\n", fp->_flag, fp->_file); 

    fp = fopen("test2.txt", "a"); 
    printf("(a) _flag = %04x, _file = %04x\n", fp->_flag, fp->_file); 

    fp = fopen("test3.txt", "w"); 
    printf("(w) _flag = %04x, _file = %04x\n", fp->_flag, fp->_file); 

} 

你可以看到每種類型的開放相關的_flag值。

在Windows/XP,我有以下幾點:

(r) _flag = 0001, _file = 0003 
(a) _flag = 0002, _file = 0004 
(w) _flag = 0002, _file = 0005 

通知,追加相同寫! _file值似乎是_iob的索引,其中stdin是_file = 0000.

無論如何,亂七八糟,試驗。嘗試從文件中寫入/讀取數據並查看_flag是否更改?

+0

這是基於任何標準,還是僅僅基於Windows? – Potatoswatter

+0

它的起源在K&R第二版之前。我的理解是Unix保留FILE結構的更簡化版本。但是你應該能夠在stdio.h中找到,看看在Unix中FILE是否包含_flag或_mode字段。我使用Windows/XP並可以獲取該信息。 – JackCColeman

+1

任何實現都有這樣的事情,所以說它的起源早於標準是一個空洞的事實。 K&R第二版本質上是對C90標準IIRC的評論,但不是對標準化和創新的嘗試。 Unix既不是標準操作系統,也不是操作系統。這個答案不過是對你所在的平臺進行反向工程的建議,這不是一個好建議。 – Potatoswatter

0
FILE * f; 
//... 
if (f->flags == 2 || f->flags == 3) { 
    // writable 
}