Ik ben met wat file-gerelateerde zaken bezig, en liep tegen het volgende aan:
Ik gebruik een template om exception-safe met filehandles te kunnen werken:
Als ik nu met
een bestand probeer te openen dat niet bestaat, krijg ik geen filehandle (oftewel: THROW_EXCEPTION(IOException, OSFileOpen); wordt uigevoerd). Als het bestand wel bestaat, krijg ik netjes een filehandle terug.
Conform de specs moet O_CREAT (specs hier) ervoor zorgen dat het bestand wordt gecreerd.
Ik werk op deze testmachine als administrator, dus het ligt niet aan mijn rechten.
De c-style 'errno' variabele geeft EINVAL terug.
Ik programmeer met Dev-Cpp, en compileer op MingW32.
Ik gebruik een template om exception-safe met filehandles te kunnen werken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| template <int flags = O_RDONLY, int mode = (S_IRUSR|S_IWUSR)> class FileGuard { private: int hFileHandle; public: FileGuard(const char *filename) : hFileHandle(::open(filename, flags, mode)) { if(hFileHandle < 0) THROW_EXCEPTION(IOException, OSFileOpen); } ~FileGuard() { if(hFileHandle >= 0) close(); } void close() { if(hFileHandle < 0) THROW_EXCEPTION(IOException, OSFileClosed); if(::close(hFileHandle) != 0) THROW_EXCEPTION(IOException, OSFileCloseError); hFileHandle = -1; } operator int() const { return hFileHandle; } }; |
Als ik nu met
C++:
1
| FileGuard<O_WRONLY | O_CREAT> test("test.txt"); |
een bestand probeer te openen dat niet bestaat, krijg ik geen filehandle (oftewel: THROW_EXCEPTION(IOException, OSFileOpen); wordt uigevoerd). Als het bestand wel bestaat, krijg ik netjes een filehandle terug.
Conform de specs moet O_CREAT (specs hier) ervoor zorgen dat het bestand wordt gecreerd.
Ik werk op deze testmachine als administrator, dus het ligt niet aan mijn rechten.
De c-style 'errno' variabele geeft EINVAL terug.
Ik programmeer met Dev-Cpp, en compileer op MingW32.
[ Voor 3% gewijzigd door B-Man op 23-08-2004 19:38 ]