一、fopen
在C语言中,操作文件之前应该先打开文件。使用<stdio.h>头文件中的fopen()函数可以打开文件,因为FILE也是结构体,我们通过返回一个文件指针就可以对文件进行操作。在用完fopen之后要记得关闭该文件流。
用法:
FILE* fl = fopen("文件名","打开方式");
其中打开方式有:
为了实现低耦合我们也可以这样写:
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"打开方式");
fclose(fl);
return 0;
}
因为在main函数中我们传入的是一个指向字符串的指针数组,所以我们可以用argv[1]来表示传入的第二个字符串,一般我们Linux中第一个传入的参数是所要编译的文件,第二个才是所要操作的文件,所以可以这样写。这样我们就可以打开一个文件了,但是我们还没有对文件进行读写操作,所以控制台还不会有任何输出。
为了判断文件是否打开成功我们还可以用if语句进行判断一下:
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"打开方式");
if(fl == NULL)
{
perror("fopen error!\n");
exit(0);
}
fclose(fl);
return 0;
}
如果fl打开失败则用函数perror打印一下,然后用exit(0)终止程序。注意:用exit()函数要加上include<stdlib.h>头文件
二、fgetc
这个是最简单的读文件操作,这个函数用来从文件指针指向的文件中读一个字符,返回的值是读取的字符,如果发生错误则返回EOF
用法:
fgetc(文件指针);
int main()
{
FILE* fl = fopen("test.txt","r");
char ch = fgetc(fl);
printf("%c",ch);
fclose(fl);
return 0;
}
在其中我们以只读的方式打开了文件test.txt,用fgetc()获取的fl指向文件的第一个字符,并把其赋值给了ch,假设我们test.txt文件内容是这样的:
abcd
则打印结果是:
a
三、fgets
与上面的fgetc()函数不同的是,fgets()函数是从一个文件中一次性读一行数据,并且它会把读取的字符串复制到缓冲区buf,并在最后追加一个null字符来终止字符串。
用法:
fgets(char *buf, int n, FILE* fl);
#define 10 SIZE
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"r");
char buf[20];
fgets(buf,SIZE,fl);
fclose(fl);
return 0;
}
其中有两种情况:
1、当SIZE大于一行的字符串时,那么当读到字符串末尾的换行符时,fgets()会返回,并在buf的最后面插入字符串结束标志'\0'。而buf缓冲区剩余的位置不会再填充
2、当SIZE小于一行的字符串时,那么会读入n-1个字符,此时并没有读到末尾的'\n',但是还是会在buf缓冲区末尾加上'\0'
可以用while循环来输出fgets()函数读入的字符串
#define 10 SIZE
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"r");
char buf[20];
while(fgets(buf,SIZE,fl)!=NULL)
{
printf("%s",buf);
}
fclose(fl);
return 0;
}
三、fputc
fputc是向指定的文件中写入一个字符
用法:
fputc(int ch,FILE* fl);
其中ch为要写入的字符,fl为文件指针,fputc()写入成功时返回要写入的字符,失败时返回EOF
如:
#define 10 SIZE
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"a");
char ch = 'a';
fputc(ch,fl);
fclose(fl);
return 0;
}
注意:此时用的打开文件方式是a,a是往文件后面追加的意思,不会覆盖文件里面已有的内容,而用w的话就会覆盖掉文件里面已有的内容。
四、fputs
fputs()函数是将一行字符串写入到指定的文件中,但不包括空字符
用法:
fputs(char *str,FILE* fl);
其中 str是要输入的字符串,fl是指向所要写入的文件的指针
#define 10 SIZE
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"打开方式");
fputs("aabbcc",fl);
fclose(fl);
return 0;
}
其中将字符串aabbcc写入到了fl指向的文件中。
五、fscanf
fscanf函数是根据format格式从fl中读取数据,与fgets类似
int fscanf(FILE *fl, const char *format, [argument...]);
其中fl是指向文件的指针,format是格式字符串,[argument...]是接收字符串的参数。fscanf()遇到空格、回车会断开,fgets遇到回车会断开
如:
#define 10 SIZE
int main(int arg,char* argv[])
{
FILE* fl = fopen(argv[1],"r+");
while(!feof(fl))
{
char buf[10] = {0};
fscanf(fl,%s,buf);
printf("%s",buf);
}
fclose(fl);
return 0;
}
其中定义了一个buf缓冲区,将读取到的字符放到buf中,然后输出
六、fprintf
fprintf()函数用于向文件中输出格式化文本,与fputs类似
该函数类似于printf函数,只是printf将文本打印到命令窗口中,fprintf将文本输出到文件中
用法:
int fprintf (FILE* fl, const char*format, [argument...])
其中,fl为指向文件的指针,format为要写入格式,[argument]为可变参数。
#include<stdio.h>
#include<stdlib.h>
int main(int arv,char *argv[])
{
FILE *fl = fopen(argv[1],"a");
if(fl == NULL)
{
perror("error!\n");
exit(0);
}
char str[] = "abcdef";
for(int i=0;i<6;i++){
fprintf(fl,"buf[%d] = %c\n",i,str[i]);
}
fclose(fl);
return 0;
}
其中定义了一个字符串str,并用fprintf函数将该字符串以"buf[%d] = %c\n"格式输入到fl指向的文件中