---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!
Program: C:\TempFile 2\Debug\TempFile.exe
R6010
- abort() has been called
(Press Retry to debug the application)
---------------------------
Прервать Повтор Пропустить
---------------------------
Вывод:
i = 0
i = 1
...
i = 506
i = 507
i = 508
Too many open files
NULL == pFile2 (Too many open files)
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, Alca, Вы писали: V>
V> fclose(pFile2);//?
V> fclose(pFile);
V>
A>>Что не так?
fclose(pFile);
fclose(pFile2);
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!
Program: C:\TempFile 2\Debug\TempFile.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\close.c
Line: 47
Expression: (_osfile(fh) & FOPEN)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
Прервать Повтор Пропустить
---------------------------
A>#include <io.h>
A>#include <string.h>
A>#include <stdio.h>
A>#include <iostream>
A>#include <assert.h>
A>int
A>_tmain(int argc, _TCHAR* argv[])
A>{
A> for (size_t i = 0; i < 5000; ++ i) {
A> std::cout << "i = " << i << std::endl;
A> FILE *pFile = fopen("C:/Test.txt", "w+");
A> assert(NULL != pFile);
A> int iFile = fileno(pFile);
A> assert(- 1 != iFile);
A> errno = 0;
A> FILE *pFile2 = fdopen(iFile, "w+");
A> if (NULL == pFile2) {
A> std::cout << strerror(errno) << std::endl;
A> std::cout << "NULL == pFile2 (" << strerror(errno) << ")" << std::endl;
A> assert(false);
A> }
A> fclose(pFile);
A> }
A> return 0;
A>}
A>
A>
A>---------------------------
A>Microsoft Visual C++ Debug Library
A>---------------------------
A>Debug Error!
A>Program: C:\TempFile 2\Debug\TempFile.exe
A>R6010
A>- abort() has been called
A>(Press Retry to debug the application)
A>---------------------------
A>Прервать Повтор Пропустить
A>---------------------------
A>
A>Вывод: A>
A>i = 0
A>i = 1
A>...
A>i = 506
A>i = 507
A>i = 508
A>Too many open files
A>NULL == pFile2 (Too many open files)
A>
A>Что не так?
ты открываешь файл два раза — один по имени, другой по номеру. получаешь два дескриптора. закрываешь только один
A>#include <io.h>
A>#include <string.h>
A>#include <stdio.h>
A>#include <iostream>
A>#include <assert.h>
A>int
A>_tmain(int argc, _TCHAR* argv[])
A>{
A> for (size_t i = 0; i < 5000; ++ i) {
A> std::cout << "i = " << i << std::endl;
A> FILE *pFile = fopen("C:/Test.txt", "w+");
A> assert(NULL != pFile);
A> int iFile = fileno(pFile);
A> assert(- 1 != iFile);
A> errno = 0;
A> FILE *pFile2 = fdopen(iFile, "w+");
A> if (NULL == pFile2) {
A> std::cout << strerror(errno) << std::endl;
A> std::cout << "NULL == pFile2 (" << strerror(errno) << ")" << std::endl;
A> assert(false);
A> }
A> fclose(pFile);
A> }
A> return 0;
A>}
A>
A>
A>---------------------------
A>Microsoft Visual C++ Debug Library
A>---------------------------
A>Debug Error!
A>Program: C:\TempFile 2\Debug\TempFile.exe
A>R6010
A>- abort() has been called
A>(Press Retry to debug the application)
A>---------------------------
A>Прервать Повтор Пропустить
A>---------------------------
A>
A>Вывод: A>
A>i = 0
A>i = 1
A>...
A>i = 506
A>i = 507
A>i = 508
A>Too many open files
A>NULL == pFile2 (Too many open files)
A>
A>Что не так?
был не прав, исправляюсь:
The file descriptor is not dup'ed, and will be closed when the stream created by fdopen() is closed.
итого, да, открывается только один дескриптор и по закрытию fclose(pFile2); он должен закрыться. второго fclose не нужно
есть 2 слоя -- целочисленные дескрипторы предоставляемые ОС и FILE структуры предоставляемые libc.
У тебя 2 структуры FILE используюшие один дескриптор.
Очевидно, что libc ведет подсчет -- сколько структур ссылается на дескриптор, и закрывает дескриптор ОС только когда не осатется структур FILE ссылающихся на него.
Очевидно, что нужно закрыть обе структуры FILE
A>>Что не так?
D>есть 2 слоя -- целочисленные дескрипторы предоставляемые ОС и FILE структуры предоставляемые libc. D>У тебя 2 структуры FILE используюшие один дескриптор. D>Очевидно, что libc ведет подсчет -- сколько структур ссылается на дескриптор, и закрывает дескриптор ОС только когда не осатется структур FILE ссылающихся на него. D>Очевидно, что нужно закрыть обе структуры FILE
нашёл здесь.
PS: Похоже стандартный хендл (FILE) надо закрывать, только вот, к примеру, _freopen закрывает вместе с ним и системный (HANDLE), а таблица CRT дескрипторов открытых функцией _open_osfhandle с системных — ещё меньше чем количество разрешённых FILE-хендлов. К примеру, под VS2005 их вообще 64 штуки (см. макрос IOINFO_ARRAYS и вызов функции _alloc_osfhnd из функции _open_osfhandle в файле osfinfo.c)
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!
Program: C:\TempFile 3\Debug\TempFile.exe
R6010
- abort() has been called
(Press Retry to debug the application)
---------------------------
Прервать Повтор Пропустить
---------------------------