/* randbin.c --- 用二进制I/O进行随机访问 */ #include<stdio.h> #include<stdlib.h> #define ARSIZE 1000//数组元素个数是 ARSIZE, 字符常量 int main(int argc, char *argv[]) { double numbers[ARSIZE];//声明数组, double value; const char *file = "numbers.dat"; int i; long pos; FILE *iofile; //创建一组double类型的值:填充数组内容 for (size_t i = 0; i < ARSIZE; i++) { numbers[i] = 100.0 * i + 1.0/(i + 1); } //二进制方式打开文件 if ((iofile = fopen(file, "wb")) == NULL) { fprintf(stderr, "Could not open %s for output.\n", file); exit(EXIT_FAILURE); } //把数组以内容以二进制方式写入文件中 fwrite(numbers, sizeof(double), ARSIZE, iofile); fclose(iofile);//关闭文件 //以二进制读的方式打开文件 if ((iofile = fopen(file, "rb")) == NULL) { fprintf(stderr, "Could not open %s for random access.\n", file); exit(EXIT_FAILURE); } //从文件中读取选定的内容 printf("Enter an index in the range 0-%d.\n", ARSIZE - 1); while (scanf("%d", &i) == 1 && i >= 0 && i < ARSIZE) { //计算读取的位置 pos = (long) i * sizeof(double); //定位文件位置:初始位置偏移 pos个字节 fseek(iofile, pos, SEEK_SET); //读取一个double数据:从定位到的位置开始读一个数据, //注意:stdio.h中的函数共享一个文件缓冲区(读缓冲区,或写缓冲区) //因此,上面fseek函数定位的位置 fread继续使用 fread(&value, sizeof(double), 1, iofile); //打印读取到的值到屏幕 printf("The value there is %f.\n", value); //超出范围跳出循环 printf("Next index (out of range to quit):\n"); } //关闭文件 fclose(iofile); //打印结束信息 printf("hello world!\n"); return 0; }
标签:ARSIZE,二进制,iofile,pos,访问,随机,file,double From: https://www.cnblogs.com/cedar007/p/17371536.html