欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言文件输入输出

程序员文章站 2024-03-18 18:11:58
...

文件打开和关闭


1.fopen()函数

fopen函数用于打开文件, 其调用格式为:
FILE *fopen(char *filename, *type);

在介绍这个函数之;前, 先了解一下下面的知识。
(1) 流(stream)和文件(file)
(2) 文件指针FILE
(3) 以后介绍的函数调用格式将直接写出形式参数的数据类型和函数返回值的数据类型。例如: 上面打开文件的函数, 返回一个文件指针, 其中形式参数有两个, 均为字符型变量(字符串数组或字符串指针)。

用法:

fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部分。如:
"C:\\TC\\TEST.DAT"。也可以只有文件名,如"yh.txt";
如果将路径写成"C:\TC\TEST.DAT"是不正确的, 这一点要特别注意。
第二个形式参数表示打开文件的类型。关于文件类型的规定参见下表。


r:以只读方式打开文件,该文件必须存在
r+:以读/写方式打开文件,该文件必须存在。
rb+:以读/写方式打开一个二进制文件,只允许读/写数据。
rt+:以读/写方式打开一个文本文件,允许读和写。

w打开只写文件,若文件存在则长度 清为0,即该文件内容消失,若不存在则创建该文件。
w+:打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。
a+:以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符不保留)。
wb:以只写方式打开或新建一个二进制文件,只允许写数据。
wb+:以读/写方式打开或建立一个二进制文件,允许读和写。
wt+:以读/写方式打开或建立一个文本文件,允许读写。
at+:以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+:以读/写方式打开一个二进制文件,允许读或在文件末追加数据。


如果成功的打开一个文件, fopen()函数返回文件指针, 否则返回空指针 (NULL)。由此可判断文件打开是否成功。

2.fclose()函数

fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为:
int fclose(FILE *stream);
该函数返回一个整型数。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。

例如:

#include
int main()
{
    FILE *fp; /*定义一个文件指针*/
    fp=fopen("yh.txt", "r");
    if(fp==NULL) /*判断文件是否打开成功*/
    {
        printf("can not open the file\n");
        exit(1);
}

if(fclose(fp)==0) /*判断文件是否关闭成功*/
    printf("O,K");
else
    puts("File close error");
return 0;

 

2.有关文件操作的函数


1.文件的顺序写函数

fprintf(), fputs(), fputc()函数

函数fprintf()、fputs()和fputc()均为文件的顺序写操作函数, 其调用格式如下:
int fprintf(FILE *stream, char *format, <variable-list>);
int fputs(char *string, FILE *steam);
int fputc(int ch, FILE *steam);
上述三个函数的返回值均为整型量。fprintf() 函数的返回值为实际写入文件中的字节数。如果写错误, 则返回一个负数, fputs()函数返回0时表明将string指针所指的字符串写入文件中的操作成功, 返回非0时, 表明写操作失败。fputc()函数返回一个向文件所写字符的值, 此时写操作成功, 否则返回EOF(文件结束结束其值为-1, 在stdio.h中定义)表示写操作错误。
fprintf( ) 函数中格式化的规定与printf( ) 函数相同, 所不同的只是 fprintf()函数是向文件中写入。而printf()是向屏幕输出。

例如:

#include
int main() {
    FILE *fp;
    fp=fopen("yh.txt", "w");
    int i, a;//输入3个数据进入文件
    for(i=0;i<3;i++)//执行3次。
    {
        scanf("%d",&a);//从键盘输入数据。
        fprintf(fp,"%d ",a);//写入文件。
    }

    char *s="That's good news"; //定义字符串指针并初始化
    fprintf(fp, "%d", 4); //写入数字
    fprintf(fp, "%s", s); //向所建文件写一字符串

    fputs("Your score of TOEFLis", fp);//向所建文件写入一串字符
    fputc(':', fp); //向所建文件写冒号:

    fclose(fp); /*关闭文件*/
    return 0;
    }
}


2.文件的顺序读函数

fscanf(), fgets(), fgetc()函数;

函数fscanf()、fgets()和fgetc()均为文件的顺序读操作函数, 其调用格式如下:
int fscanf(FILE *stream, char *format, <address-list>);
char fgets(char *string, int n, FILE *steam);
int fgetc(FILE *steam);
fscanf()函数的用法与scanf()函数相似, 只是它是从文件中读到信息。 fscanf()函数的返回值为EOF(即-1), 表明读错误, 否则读数据成功。fgets()函数从文件中读取至多n-1个字符(n用来指定字符数), 并把它们放入string指向的字符串中, 在读入之后自动向字符串未尾加一个空字符, 读成功返回string指针, 失败返回一个空指针。fgetc()函数返回文件当前位置的一个字符, 读错误时返回EOF。

例如:

#include
int main() {
    FILE *fp;
    fp=fopen("yh.dat", "r"); /*打开文字文件只读*/
    char *s, m[20];
    int i;
    fgets(s, 6, fp); //从文件中读取5个字符,注意,字符串结尾有‘\0’,也计入长度,所以读入的是5个字符
    printf("%s", s); /*输出所读的字符串*/
    fscanf(fp, "%d", &i); /*读取整型数*/
    printf("%d", i); /*输出所读整型数*/
    putchar(fgetc(fp)); //读取一个字符,同时输出
    fgets(m, 17, fp); /*读取16个字符*/
    puts(m); /*输出所读字符串*/
    fclose(fp); /*关闭文件*/
    return 0;
}

3.feof和rwind函数

这两个函数的调用格式为:
int feof(FILE *stream);
int rewind(FILE *stream);
feof()函数检测文件位置指示器是否到达了文件结尾, 若是则返回一个非0 值, 否则返回0。这个函数对二进制文件操作特别有用, 因为二进制文件中, 文件结尾标志EOF也是一个合法的二进制数, 只简单的检查读入字符的值来判断文件是否结束是不行的。如果那样的话, 可能会造成文件未结尾而被认为结尾, 所以就必须有feof()函数。
下面的这条语句是常用的判断文件是否结束的方法。
while(!feof(fp))
fgetc(fp);
while为循环语句, 将在下面介绍。
rewind()函数用于把文件位置指示器移到文件的起点处, 成功时返回0, 否则, 返回非0值。


PS:

fwrite()函数和fprintf()函数区别

fwrite的用法,如下;

#include
int main() {
    FILE *fp;
    fp=fopen("yh.txt","w");
    char s[]="I wanna fly!";
    fwrite(s, sizeof(char), sizeof(s), fp);
/*fwrite(1, 2, 3, 4);
1,是数据的地址;
2,是单位的字节
3, 是数据的单位
4, 是要写入的文件流 */
return 0;


区别:

fwrite写的是二进制内容,fprintf写的是数字转换成ASCII码之后的字符。两者都把数字64写入一个文件,用记事本打开看下,fwrite写的打开是乱码,fprintf写入的是6和4这两个字符。因为fwrite写的是64的二进制表示(4个字节,前面全是0,最后八位是0100000),fprintf写入的实际内容是36H和34H(16进制表示的字符6和字符4的ASCII编码)

相关标签: 文件输入输出