在VC++编程中,有时我们需要将结构体的数据存入文本文件并在之后读取。这篇笔记主要探讨了如何处理这个问题,特别是在处理结构体成员为不同数据类型(如整型、浮点型和字符串)时的读写操作。我们将通过一个简单的例子来详细说明整个过程。
我们定义了一个名为`student`的结构体,它包含三个成员:一个短整型`m1`,一个单精度浮点型`m2`,以及一个长度为20的字符数组`m3`,用来存储字符串。
```cpp
struct student{
short m1;
float m2;
char m3[20];
};
```
接下来,我们创建两个`student`结构体实例`aa[2]`,并为其分配值。例如,我们可以为`aa[0]`和`aa[1]`分别设置值:
```cpp
int i1, i2;
float j1, j2;
CString str1, str2;
i1 = 20;
j1 = 20.3f;
str1 = "lifanupc02";
i2 = 30;
j2 = 30.3f;
str2 = "lifanupc03";
char szStr[20];
// 将字符串赋值到结构体的m3成员,注意处理字符串长度超过20的情况
aa[0].m1 = 2;
aa[0].m2 = 2.3f;
if (str1.GetLength() < 20)
lstrcpy(aa[0].m3, str1);
else // 如果字符串过长,进行截断
{
memcpy(aa[0].m3, str1, 19);
szStr[19] = '\0';
}
aa[1].m1 = 2;
aa[1].m2 = 2.3f;
if (str2.GetLength() < 20)
lstrcpy(aa[1].m3, str2);
else
{
memcpy(aa[1].m3, str2, 19);
szStr[19] = '\0';
}
```
写入数据到文本文件时,我们使用`CFile`类来操作文件。在这个例子中,我们创建一个`CFile`对象`file`,并以二进制模式打开或创建文件"123.txt":
```cpp
CFile file;
file.Open("123.txt", CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);
```
然后,我们调用`Write`方法,将整个`aa`数组(即两个`student`结构体实例)写入文件:
```cpp
file.Write(&aa, sizeof(aa));
```
完成写入后,关闭文件:
```cpp
file.Close();
```
读取数据的过程与写入类似。首先打开文件,这次是以读取二进制模式:
```cpp
file.Open("123.txt", CFile::modeRead | CFile::typeBinary);
```
然后,使用`Read`方法一次性读取整个数组到`aa`:
```cpp
file.Read(&aa, sizeof(aa));
```
关闭文件并处理读取的数据:
```cpp
file.Close();
// 访问读取的结构体数据
m1 = aa[1].m1;
m2 = aa[1].m2;
str1 = aa[1].m3;
```
这里需要注意的是,当读取字符串时,`aa[1].m3`已经被解析为一个字符数组,可以直接赋值给`CString`对象,无需额外格式化。
总结来说,这个例子展示了如何在VC++环境中使用`CFile`类进行结构体数据的读写操作。这包括了结构体的定义、初始化、文件的打开、数据的写入和读取,以及处理字符串过长的情况。在实际项目中,这样的操作可能需要进行错误检查和异常处理,以确保程序的健壮性。