[詳解]
15 #ifndef INCG_IRIS_IUTEST_FILE_HPP_77D2C2B9_F504_4BB5_BA56_D97A2EB37DC6_
16 #define INCG_IRIS_IUTEST_FILE_HPP_77D2C2B9_F504_4BB5_BA56_D97A2EB37DC6_
31 class IFile :
public detail::IOutStream,
public detail::IInStream
51 bool Open(
const char* filename,
int mode)
53 return OpenImpl(filename, mode);
56 #if IUTEST_HAS_STD_FILESYSTEM
63 bool Open(const ::std::filesystem::path& path,
int mode)
65 return Open(path.string().c_str(), mode);
70 virtual void Close() = 0;
72 virtual bool OpenImpl(
const char* filename,
int mode) = 0;
88 virtual ~IFileSystem()
94 virtual void Initialize() {}
97 static IFileSystem* GetInstance() {
return GetInstanceVariable().pInstance; }
102 IFileSystem* fs = GetInstance();
107 IFile* p = fs->Create();
110 static void Free(IFile* ptr)
112 IFileSystem* fs = GetInstance();
120 static bool ReadAll(
const char* filename, ::std::string& dst)
122 IFile* fp = detail::IFileSystem::New();
130 detail::IFileSystem::Free(fp);
135 detail::IFileSystem::Free(fp);
140 virtual IFile* Create() = 0;
141 virtual void Delete(IFile*) = 0;
144 struct InstanceVariable
146 IFileSystem* pInstance;
149 static InstanceVariable& GetInstanceVariable() {
static InstanceVariable v;
return v; }
150 static void SetInstance(IFileSystem* pFileSystem) { GetInstanceVariable().pInstance = pFileSystem; }
162 template<
typename FILE>
163 class FileSystem :
public detail::IFileSystem
203 if( fwrite(buf, size, cnt, m_fp) < cnt )
207 if( fflush(m_fp) != 0 )
222 if( fread(buf, size, cnt, m_fp) < cnt )
232 #if IUTEST_HAS_FILE_STAT
235 return GetSizeBySeekSet(m_fp);
240 static size_t GetSize(FILE* fp)
246 #if IUTEST_HAS_FILE_STAT
247 internal::posix::StatStruct st;
248 if (internal::posix::Stat(fp, &st) != 0)
250 return GetSizeBySeekSet(fp);
253 return static_cast<size_t>(st.st_size);
255 return GetSizeBySeekSet(fp);
258 static size_t GetSizeBySeekSet(FILE* fp)
264 const long pre = ftell(fp);
265 if( (pre != -1) && (fseek(fp, 0, SEEK_END) == 0) )
267 const size_t size =
static_cast<size_t>(ftell(fp));
268 IUTEST_UNUSED_RETURN(fseek(fp, pre, SEEK_SET));
277 IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN()
281 m_fp = fopen(filename,
"rb");
284 m_fp = fopen(filename,
"wb");
287 m_fp = fopen(filename,
"ab");
292 IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END()
297 class StdErrorFile : public StdioFile
320 #if IUTEST_HAS_STRINGSTREAM
325 class StringStreamFile :
public IFile
345 for(
size_t i=0; i < cnt; ++i )
347 ss.write(
static_cast<const char*
>(buf), size);
360 char* p =
static_cast<char*
>(buf);
361 for(
size_t i = 0; i < cnt; ++i )
372 ::std::stringstream::pos_type pre = ss.tellg();
373 ss.seekg(0, ::std::ios::end);
374 ::std::stringstream::pos_type size = ss.tellg();
375 ss.seekg(pre, ::std::ios::beg);
376 return static_cast<size_t>(size);
391 ::std::stringstream ss;
402 class NoEffectFile :
public IFile
416 #endif // INCG_IRIS_IUTEST_FILE_HPP_77D2C2B9_F504_4BB5_BA56_D97A2EB37DC6_
virtual ::std::string ReadAll() IUTEST_CXX_OVERRIDE
全読み込み
Definition: iutest_file.hpp:381
文字列バッファ書き込み IFile インターフェースクラス
Definition: iutest_file.hpp:326
virtual bool Write(const void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
書き込み
Definition: iutest_file.hpp:344
virtual size_t GetSize() IUTEST_CXX_OVERRIDE
サイズ取得
Definition: iutest_file.hpp:231
#define IUTEST_CXX_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:734
iutest root namespace
Definition: iutest_charcode.hpp:31
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:188
OpenFlag
ファイルオープンモードフラグ
Definition: iutest_file.hpp:36
virtual size_t GetSize() IUTEST_CXX_OVERRIDE
サイズ取得
Definition: iutest_file.hpp:371
virtual void Close()=0
閉じる
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:670
virtual bool Read(void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
読み込み
Definition: iutest_file.hpp:221
@ OpenAppend
追記
Definition: iutest_file.hpp:40
bool Open(const char *filename, int mode)
開く
Definition: iutest_file.hpp:52
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:307
ファイルクラスインターフェイス
Definition: iutest_file.hpp:32
@ OpenRead
読み込み
Definition: iutest_file.hpp:38
virtual bool Read(void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
読み込み
Definition: iutest_file.hpp:359
標準ファイルクラス
Definition: iutest_file.hpp:177
ファイル処理クラスインターフェイス
Definition: iutest_file.hpp:164
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:334
@ OpenWrite
書き込み
Definition: iutest_file.hpp:39
Definition: iutest_file.hpp:298
virtual bool Write(const void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
書き込み
Definition: iutest_file.hpp:202