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-us/library/aa366789%28VS.85%29.aspx

Lunix:
http://stackoverflow.com/questions/4862327/is-there-a-way-to-get-the-filename-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