2013-08-31 15 views
5

Gibt es eine Möglichkeit zu sagen, in welchem ​​Modus ein FILE * geöffnet wurde?Ermitteln, ob FILE * beschreibbar ist

Insbesondere muss ich sagen, ob ein Dateistream beschreibbar ist. Entweder nur das wahre/falsche Ergebnis davon, ob es beschreibbar ist, oder die const char * des Modus selbst ist gut.

+2

Es gibt keinen Standard Weg, es zu tun, aber die meisten Plattformen werden Sie auf die eine oder andere Weise tun können. Wenn Sie nicht versuchen, vollständig plattformübergreifend zu arbeiten (oder es Ihnen nichts ausmacht, für verschiedene Plattformen einen anderen Code zu verwenden), sollten Sie Ihr Betriebssystem angeben, und Sie erhalten möglicherweise eine anständige Antwort. – zneak

Antwort

2

In der Regel nicht, gibt es nicht. Sie müssen diese Informationen selbst im Auge behalten. Sie können in der Lage sein, zu versuchen, in die Datei schreiben und entweder einen Fehler oder Erfolg, aber das hängt genau davon ab, was Sie versuchen zu tun.

3

Nicht direkt Ihre Frage beantworten, aber Sie freopen

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

Es öffnet sich eine bestimmte Datei auf einem bestimmten Strom, Schließen der Strom zuerst, wenn es bereits ist offen verwenden können. Hatte der Stream zuvor eine Orientierung, löscht freopen es.

3

JA, es gibt Wege, aber sie sind historisch in der Natur und von anderen verpönt. Außerdem müssen Sie die genauen Werte recherchieren/testen und dann das Risiko eingehen, dass eine neue Version des Betriebssystems Ihre Annahmen rückgängig macht.

In diesem Fall können Sie Felder innerhalb der FILE-Struktur für bestimmte Werte testen. Die Struktur befindet sich in stdio.h und die Interessenbereiche sind: _flag und _file.

Write-up einige Charakterisierung Code und laufen auf dem System, wie:

#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); 

} 

können Sie die _flag Werte sehen mit jeder Art zugeordnet offen.

Unter Windows/XP, habe ich die folgenden:

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

Hinweis, hängen Sie ist die gleiche wie Schreib! Die _file-Werte scheinen der Index in das _iob zu sein, wobei stdin _file = 0000 ist.

Wie auch immer, herumspielen, experimentieren. Versuchen Sie, Daten aus den Dateien zu schreiben/zu lesen und zu sehen, ob _flag ändert ???

+0

Basiert dies auf einem Standard oder nur auf Windows? – Potatoswatter

+0

Es ist Ursprünge vor Termine K & R, zweite Ausgabe. Es ist mein Verständnis, dass Unix eine kürzere Version der FILE-Struktur beibehält. Aber Sie sollten in stdio.h finden können und sehen, ob FILE ein _flag oder _mode-Feld in Unix enthält. Ich benutze Windows/XP und kann diese Information bekommen. – JackCColeman

+1

Jede Implementierung hat so etwas, also ist es eine leere Wahrheit zu sagen, dass ihre Ursprünge vor einem Standard liegen. Die zweite Ausgabe von K & R war im Wesentlichen ein Kommentar zum C90-Standard, IIRC, aber kein Versuch der Standardisierung oder Innovation. Unix ist weder ein Standard noch ein Betriebssystem. Diese Antwort ist nichts anderes als ein Vorschlag, die Plattform, auf der Sie sich befinden, zurückzuentwickeln, was kein guter Vorschlag ist. – Potatoswatter

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