在上一篇文章中,我们初步了解了freopen()函数的用法。但在一些算法竞赛中不允许使用文件重定向操作,这时我们就只能用标准C头文件stdio.h中的fopen()函数进行对文件的读写了。
fopen()函数的不足之处就在于使用的方法复杂,写起来比较麻烦。但是它灵活度比freopen()要高得多,比如支持多文件同时读写等等。
实现方法:在main函数之前定义一个类型为FILE*的指针,并使它指向创建的文件。
FILE* fp1 = fopen("D:\\abc.in", "r"); FILE* fp2 = fopen("D:\\abc.out", "w");
同样地,fopen的第一个参数为文件的路径和名称,第二个参数为文件操作的模式(在上一篇文章初步介绍过,用法一样)。当文件打开失败,则返回值为NULL。最后别忘记要调用fclose()。
下面仍然是一个实例,不过要比上一次的难一点,但还是很简单。
【输入】输入文件为abc.in:一组整数,它们的数量未知
【输出】输出文件为abc.out:第一行输出这组整数的个数,第二行输出这些整数的和。
源代码如下(在VS2008下编译通过):
int main(void) { FILE* input = fopen("D:\\abc.in", "r"); if (input == NULL) { printf("Failed to open the file!\n"); return -1; } //如果打开失败,则退出程序 FILE* output = fopen("D:\\abc.out", "w"); int a, sum = 0, total = 0; while(fscanf(input, "%d", &a) != EOF) //在还未读到EOF时不断统计数字个数total和总和sum { sum += a; total++; }; fprintf(output, "Sum is %d.\n", sum); fprintf(output, "There are %d numbers.\n", total); fclose(input); fclose(output); return 0; }
分析这段代码,我们得到两个函数:
int fscanf(FILE *stream, const char *format, ...); int fprintf(FILE *stream, const char *format, ...);
不难看出,他们分别表示对文件进行读写操作。与scanf和printf相似,只是第一个参数是指向指定文件的指针。这一点就没有freopen()函数那么简单。
好的,以上就是文件I/O的标准函数的常用部分,在下一篇文章我们会介绍一些其他不太正式的文件操作函数的用法。
时间: 2024-10-25 21:40:58