我有一个ASCII文件,每一行都包含一个不定长度的记录。例如:
Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters
由于文件大小约为10GB,我希望能够分块读取记录。一旦读取完成,我需要将它们进行转换,并以二进制格式写入另一个文件中。
因此,在读取方面,我的第一反应是创建一个char数组,例如:
FILE *stream;
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);
- 假设Linux会发出一个系统调用并获取整个100MB的数据,这是否正确?
- 由于记录是通过换行符分隔的,因此我在缓冲区中逐个字符搜索换行符并重建每个记录。
我的问题是,这是我应该如何分块读取数据并重建每个记录的方式,还是有更好的替代方法可以一次性读取ASCII文件中x个大小可变的行?
接下来,在写入过程中,我执行相同的操作。我有一个写字符缓冲区,将其传递给fwrite以一次性写入整组记录。
fwrite(buffer, sizeof(buffer), 104857600, stream);
更新:如果我使用 setbuf(stream, buffer) 将缓冲区(buffer)设置为100MB的字符缓冲区,fgets函数是否会从缓冲区中获取数据,还是会进行磁盘IO操作?