c++ Odczytywanie z otwartego pliku

0

Jak odczytać nazwę pliku gdy jest otwarty ? Ta sama funkcja zależnie od wybranej opcji działa na jednym z 2 plików. Wewnątrz musi się znaleźć sprawdzenie na którym działa. Przejrzałem forum i nic o tym nie znalazłem.

0

przeciez musisz podac parametr CO otwierasz. Tam masz swoja nazwe ;)

1

fstream nie przechowuje nazwy/ścieżki pliku. Sam musisz zapamiętać nazwę gdy otwierasz taki plik.

0

W standardowym C++ raczej nie da się tego sprawdzić.
Poza standardowym C++ jest to raczej wykonalne (np Qt).

2

Zaczynam więc kopać. Konstruktor ofstream:

explicit basic_ofstream(const char *_Filename,
    ios_base::openmode _Mode = ios_base::out,
    int _Prot = (int)ios_base::_Openprot)
    : _Mybase(&_Filebuffer)
    {   // construct with named file and specified mode
    if (_Filebuffer.open(_Filename, _Mode | ios_base::out, _Prot) == 0)
        _Myios::setstate(ios_base::failbit);
    }

Widać tutaj, że nazwa pliku idzie do metody _FileBuffer.open. Poza tym nic się z nią nie dzieje, więc kopiemy dalej.

_Myfb *rdbuf() const
{   // return pointer to file buffer
return ((_Myfb *)&_Filebuffer);
}

Na początek oczywiście sprawdzam, czy _FileBuffer jest dostępne z zewnątrz. Powyższa metoda jest oczywiście publiczna.

_Myt *open(const char *_Filename,
    ios_base::openmode _Mode,
    int _Prot = (int)ios_base::_Openprot)
    {   // open a C stream with specified mode
    _Filet *_File;
    if (_Myfile != 0 || (_File = _Fiopen(_Filename, _Mode, _Prot)) == 0)
        return (0); // open failed

    _Init(_File, _Openfl);
    _Initcvt(&_USE(_Mysb::getloc(), _Cvt));
    return (this);  // open succeeded
    }

Powyżej widać definicje metody _FileBuffer.open. Widzimy, że nazwa pliku jest przekazywana tylko do funkcji _Fiopen. Rezultat jest prekazywany do metody _Init. Sprawdziłem co się tam dzieje. Rezultat jest zapisywany w zmiennej prywatnej nieudostępnianej nikomu, nigdy, nigdzie. Z czystej programistycznej ciekawości sprawdziłem co się dzieje z nazwą pliku:

extern _MRTIMP2_NCEEPURE _Filet *__CLRCALL_PURE_OR_CDECL _Fiopen(
    const char *,
    ios_base::openmode, int);

Mamy tutaj funkcję biblioteczną, która zwraca dziwny typ. Szybko go zidentyfikowałem:

#define _Filet _iobuf

A stąd prosta droga do:

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;

Odpowiedź: Mimo, że to jest głupie to sprawdziłem i nie da się tego zrobić. (kształt struktury...)

0

Z premedytacją zrobiłem drugi post, coby nie pomieszać wątków. Lecimy teraz z rozwiązaniami platform dependent:

Windows (tak - wiem, że to nic nie zdziała przy FILE*, ale zaraz sprawdzę jak jest wypełniana struktura FILE i jak wygląda windowsowski HANDLE dla pliku.):
http://msdn.microsoft.com/en-[...]rary/aa366789%28VS.85%29.aspx

Lunix:
http://stackoverflow.com/ques[...]me-from-a-file#answer-4862476

0

Dzięki wielkie za wszystkie odpowiedzi. Będę zajmował się tym w weekend to napiszę w razie problemów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0