这里介绍一下在文件操作中几个重要的函数
常用函数如下:
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
1.fopen函数、fprintf函数
(printf函数是输出内容到控制台,fprintf输出内容到某文件中)
例如:
#include<stdio.h>
int main()
{
int ar[] = {12,23,34,45,56,67,78,89,90,100};
int n = sizeof(ar) / sizeof(ar[0]);
FILE *fp = NULL;
//C:\Bit\Test1.txt
//fp = fopen("C:\\Bit\\Test1.txt", "r");
fp = fopen("Test1.txt", "w");
if(fp == NULL)
{
printf("Open File Error.\n");
return;
}
for(int i=0; i<n; ++i)
{
//printf("%d ", ar[i]);
fprintf(fp,"%d ", ar[i]);
}
printf("\n");
fclose(fp);
return 0;
}
结果如下:
可看出在与当前文件在同一目录下,生成了一个Test1.txt文件,将数组内容输出到该文件中。
fscanf是读取某文件内容
例如:
#include<stdio.h>
void main()
{
int ar[10];
FILE *fp = fopen("Test1.txt", "r");
if(fp == NULL)
{
printf("Open Error.\n");
return;
}
for(int i=0; i<10; ++i)
{
//scanf("%d", &ar[i]);
fscanf(fp, "%d", &ar[i]);
}
for (int i = 0; i < 10; i++)
{
printf("%d ", ar[i]);
}
fclose(fp);
}
结果为:
2.fgetc函数及fputc函数
#include<stdio.h>
#include<assert.h>
void main()
{
FILE *fpIn = fopen("Test.c", "r");
assert(fpIn != NULL);
FILE *fpOut = fopen("Test2.txt", "w");
assert(fpOut != NULL);
//Copy
char ch = fgetc(fpIn);
while(ch != EOF)
{
fputc(ch, fpOut);
ch = fgetc(fpIn);
}
fclose(fpIn);
fclose(fpOut);
}
结果为:
在当前目录下,生成了Test2.txt,其内容和本文件及Test.c内容完全一样。
3.fgets函数及fputs函数
例如:
#include<stdio.h>
#include<assert.h>
void main()
{
FILE *fpIn = fopen("Test.c", "r");
assert(fpIn != NULL);
FILE *fpOut = fopen("Test2.txt", "w");
assert(fpOut != NULL);
//Copy
char buf[128] = {0};
//建议
char *res = fgets(buf, 128, fpIn);
while(res != NULL)
{
fputs(buf, fpOut);
res = fgets(buf, 128, fpIn);
}
fclose(fpIn);
fclose(fpOut);
}
结果如下:
与上一个例子结果相同,即在当前目录下,生成了Test2.txt,其内容和本文件及Test.c内容完全一样。
4.fread函数及fwrite函数
#include<stdio.h>
//成功将C++.jpg复制为Java.jpg(需要用二进制读写的方式)
void main()
{
FILE *fpIn = fopen("C++.jpg", "rb");
assert(fpIn != NULL);
FILE *fpOut = fopen("Java.jpg", "wb");
assert(fpOut != NULL);
//size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
//size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
char buf[128] = {0};
size_t cnt = fread(buf, sizeof(char), 128, fpIn);
while(cnt != 0)
{
fwrite(buf, sizeof(char), cnt, fpOut);
cnt = fread(buf, sizeof(char), 128, fpIn);
}
fclose(fpIn);
fclose(fpOut);
}
结果为:
在当前目录下,生成了Java.jpg,图片和C++.jpg完全一样。