以非二进制模式从程序操作(读/写)文件数据

时间:2013-12-06 11:39:15

标签: c database file-io

我正在为项目制作学校数据库系统。要求禁止我使用二进制模式(即“rb”)。问题是,在七个选项之一,选项1中,我需要加载所有文件,这意味着如果我使用选项3,它将学生记录(学生ID和学生姓名)添加到文件,然后当我在选项1中再次加载所有文件时,程序意味着识别文件中已有的信息。因此,如果我再次使用选项3,程序应该阻止我在添加新学生记录时输入相同的学生ID(因为这是项目限制之一)。据我所知(这不是很多......),以二进制模式操作文件数据会使这更容易,因为您可以操作数据块等。我并不完全熟悉这一点,我希望有人能提出一些我可以使用的功能。实际上,更具体地说,根据我的理解二进制模式的优点是它很容易计算(偏移?),所以也许我需要能够在非二进制模式下操纵偏移?如果是这样,任何人都会启发我。

1 个答案:

答案 0 :(得分:0)

简而言之,它是一个文本文件?

然后,你永远不应该尝试“更新”文件。只需读取它(在过程中解析它),更新解析的数据,并覆盖文件。

这可以通过“创建新的,然后删除旧的并重命名新”方法来完成,这样做的好处是可以在不将整个文件加载到内存中的情况下完成(只需从输入文件读取一条记录,更新在适当的时候,将其写入输出流,冲洗,重复)。

struct Record { ... }
int ReadAndParseRecord(FILE*, struct Record*); /*Will contain calls to fgets(), fscanf()*/
void WriteRecord(FILE*, struct Record const *); /*Will contain calls to fputs(), fprintf()*/

void DoWorkOnOneRecord(struct Record *);

void DoWork(char const *filenameIn, char const *filenameOut)
{
    FILE* fileIn = fopen(filenameIn, "r");
    FILE* fileOut = fopen(filenameOut, "w");
    struct Record currentRecord;
    while(ReadAndParseRecord(fileIn, &currentRecord))
    {
        DoWorkOnOneRecord(&currentRecord);
        WriteRecord(fileOut, &currentRecord);
    }
    /*If there are any records to add, do it here*/
    /*...*/
    fclose(fileIn), fclose(fileOut);
}

当您必须更新文件时,将DoWork()转换为新文件,然后删除旧文件并重命名新文件(您也可以备份旧文件,在这种情况下将序列更改为“删除备份,重命名旧备份,重命名新备份”。