C库函数的文件操作是独立于具体操作系统平台的。
FILE * fopen(const char * filename,const char* mode)
filename:要创建的文件名(包含路径,缺省为当前路径)
mode:打开模式
常见的打开模式:
r,rb:只读方式打开
w,wb:只写的方式打开,如果文件不存在,则创建文件
a,ab:追加的方式打开,如果文件不存在,则创建文件
r+,r+b,rb+:读写的方式打开
w+,w+B,wb+:读写的方式打开,如果文件不存在,则创建文件
a+,a+b,ab+:读和追加的方式打开,如果文件不存在,则创建文件
注意:b用于区分二进制文件和文本文件(在linux下不区分二进制文件和文本文件)
返回值 : 如果打开成功,返回值为非NULL值, 打开失败,返回NULL
/////////////////////文件打开例子:
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("hello.c", "r");
if(fp != NULL)
{
printf("open success\n");
}
else
{
printf("file open failed\n");
}
}
2.库函数 - 读
size_t fread (void *ptr,size_t size,size_t n,FILE *stream)
功能:
从stream指向的文件中读取n哥字段,每个字段为size字节,并将读取的数据放入prt所指向的字符数组中,返回实际已读取的字节数。
#include <stdio.h>
int main()
{
int a[10];
FILE *fp = fopen("aaaa", "rb");
if(fp != NULL)
{
int i;
fread(a, sizeof(int), 10, fp);
for(i = 0; i < 10; i++)
{
printf("%d\n", a[i]);
}
fclose(fp);
}
}
size_t fwrite(const void *ptr,size_t size,size_t n,FILE * stream)
功能:从缓冲区ptr所指的数组中把n个字段写到stream指向的文件中,每个字段长为size哥字节,返回实际写入的字段数。
#include <stdio.h>
int main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
FILE *fp = fopen("aaaa", "wb");
if(fp != NULL)
{
fwrite(a, sizeof(int), 10, fp);
fclose(fp);
}
}
4.库函数 - 读字符
int fgetc(FILE * stream)
从制定的文件中读一个字符
参数: FILE *stream , fopen的返回值
返回值:读出的字符
//////////////////fgetc 例子(输出一个文本文件内容)
#include <stdio.h>
int main()
{
char ch;
FILE *fp = fopen("hello.c", "r");
if(fp != NULL)
{
ch = fgetc(fp); //读出一个字符
while(ch != EOF) //EOF 当fgetc读到了文件尾,返回值是EOF
{
printf("%c", ch);
ch = fgetc(fp);
}
}
else
{
printf("file open failed\n");
}
}
int fputc(int c,FILE *stream)
向制定的文件中写入一个字符
6.库函数 - 格式化读
fscanf(FILE *stream,char *format[,atgument...])
从一个流中进行格式化输入
7.库函数 - 格式化输出
int fprintf(FILE *stream,char *format[,atgument...])
格式化输出一个流中
8.库函数 - 定位
int fseek(FILE* stream,long offset,int whence)
stream fopen 返回值
offset 偏移量 (100, -100) 100 向后移100字节 -100 向前移100字节
SEEK_SET:相对文件开头
SEEK_CUR:相对文件对鞋指针的当前位置
SEEK_END:相对文件末尾
#include <stdio.h>
#include <memory.h>
int main ()
{
char buf[10] = { 0 };
FILE *fp = fopen("hello.c", "r");
if(fp != NULL)
{
fseek(fp, -10, SEEK_END);
while(fread(buf, 1, 10,fp) > 0)
{
printf("%s", buf);
memset(buf, 0, sizeof(buf));
}
}
}
9.库函数 - 路径获取
char * getcwd(char * buffer,size_t size)
提供一个size大小的buffer,getcwd会把当前的路径名copy到buffer中。如果buffer太小,返回“-1”
10.库函数 - 创建目录
int mkdir (char *dir,int mode)
注意:包含头文件#include<sys/stat.h>
功能:创建一个新目录
返回值:0表示成功,-1表示失败
11.库函数 - 关闭
fclose(fp);
关闭文件,如果缓冲区中有数据,会将缓冲区中的数据强制写入文件
12.库函数 - 读一行
char *fgets(char *s, int size, FILE *stream);
参数1: char *s, 读出的数据存放的位置
2: 将要读出的数据的最大值(最多读多少个字符)
3: 文件指针
返回值:
NULL 读到了文件尾
非NULL 读到了正确的数据
#include <stdio.h>
int main()
{
char buf[100];
FILE *fp = fopen("hello.c", "r");
if(fp != NULL)
{
while(1)
{
char *ret;
ret = fgets(buf, sizeof(buf), fp); //从文件fp中最多读sizeof(buf)个字符,放到buf中
//执行一次,会读出一行,数据放到buf中
//如果一行多于buff,那么最多读sizeof(buf)个字节
//如果一行少于buff,那么就读出一行
if(ret == NULL)
{
break;
}
else
{
printf("%s", buf);
}
}
}
}
13.库函数 - 写一行
fputs(const char *s, FILE *stream);
参数 s, 是要写到文件中的数据存放位置
stream fopen的返回值
#include <stdio.h>
int main()
{
char buf[100];
FILE *fp = fopen("c.c", "w");
if(fp != NULL)
{
int i;
for(i = 0; i < 5; i++)
{
scanf("%s", buf);
sprintf(buf, "%s\n", buf); //给buf加一个'\n'
fputs(buf, fp);
///fflush(fp); ///强行将缓冲区中的数据写入到文件中
}
fclose(fp);
}
}