//写入字符串 void WriteString(CFile &file, CString &s) { int len = s.GetLength(); //写入字符串的长度 file.Write(&len, sizeof(len)); //写入字符串 file.Write(/*(LPCTSTR)*/s, len); } //读取字符串 bool ReadString(CFile &file, CString &s) { //先读取字符串长度 int len = 0; if (file.Read(&len,sizeof(len)) == sizeof(int)) { TRACE(_T("string length is : %d bytes/r/n"), len); //len = len*2; //unicode TCHAR *sp = new TCHAR[len+1]; sp[len] = 0; if (file.Read(sp, len) == len) { s = sp; delete [] sp; return true; } delete [] sp; } return false; } //读取指定索引的字符串 bool ReadString(CFile &file, CString &s, int index) { //必须从头开始数 file.SeekToBegin(); int i = 0; while (i < index) { //读取记录长度 int len = 0; if (file.Read(&len, sizeof(len)) != sizeof(len)) return false; //定位文件指针 file.Seek(len, CFile::current); i++; } return ReadString(file, s); } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { CFile file; file.Open(_T("test.out"), CFile::modeWrite | CFile::modeCreate); CString s1 = _T("chain"); CString s2 = _T("study"); CString s3 = _T("VC++"); //写入 WriteString(file, s1); WriteString(file, s2); WriteString(file, s3); file.Close(); //读取 file.Open(_T("test.out"), CFile::modeRead); printf("文件大小: %d bytes/r/n", file.GetLength()); int i = 0; while (1) { CString s; if (!ReadString(file, s)) break; _tprintf(_T("[%d]: %s/r/n"), i, s); i++; } CString s; //if (ReadString(file, s, 1)) // printf("[%d]: %s/r/n", i, s); return 0; } 以上仅支持MBCS。 程序为变长数据块的读写,将数据块的长度记录在每段数据块的头部。 采用这种方法可以大大节省存储空间