C语言之文件指针的文件操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言之文件操作
基于文件指针的文件操作(缓冲)
对文件进行的操作有打开文件,关闭文件,读写文件。

其中打开文件是第一步,可以说是为其它操作做准备的。

文件指针:每打开一个文件,就返回一个指针(FILE*类型),称为文件指针。

这个指针指向了这个文件相关的所有信息,即我们就可以用这个指针代表这个文件,通过这个指针可以对这个打开的文件进行各种操作。

缓冲区:输入输出的数据并不是一下子直接到电脑内存和显示器中,输入的数据先暂时存放在键盘缓冲区中,然后程序从该缓冲区中读取数据。

输出的数据先暂时存放在输出缓冲区中,然后再把该数据输出到屏幕中。

文件的创建,打开与关闭
原型为:
#include <stdio.h> //头文件包含
FILE *fopen(const char *path,const char *mode); //文件名模式
int fclose(FILE *stream);
fopen以mode的方式打开或创建文件,如果成功,将返回一个文件指针,失败则返回NULL.
fopen创建的文件的访问权限将以0666与当前的umask结合来确定。

mode的可选模式列表
模式读写位置截断原内容创建
rb Y N 文件头N N
r+b Y Y 文件头N N
wb N Y 文件头Y Y
w+b Y Y 文件头Y Y
ab N Y 文件尾N Y
a+b Y Y 文件尾N Y 在Linux系统中,mode里面的’b’(二进制)可以去掉,但是为了保持与其他系统的兼容性,建议不要去掉。

ab和a+b为追加模式,在此两种模式下,无论文件读写点定位到何处,在写数据时都将是在文件末尾添加,所以比较适合于多进程写同一个文件的情况下保证数据的完整性。

读写文件
基于文件指针的数据读写函数较多,可分为如下几组:
数据块读写:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread从文件流stream 中读取nmemb个元素,写到ptr指向的内存中,每个元素的大小为size个字节。

fwrite从ptr指向的内存中读取nmemb个元素,写到文件流stream中,每个元素size个字节。

所有的文件读写函数都从文件的当前读写点开始读写,读写完以后,当前读写点自动往后移动size*nmemb个字节。

示例:
#include <stdio.h>
int main()
{
char buf[50] = {'h','e','l','l','o'};
FILE *p;//定义一个FILE结构体类型的指针p
p = fopen("a.txt", "r+b");//p这个指针此时就和文件a.txt关联起来了。

fwrite(buf, 1, 5, p);//把buf里面的内容写到p指向的文件中。

char buf1[50] = {0};
fread(buf1, 1, 5, p);
printf("buf1:%s\n", buf1);
fclose(p);//关闭p代表的文件a.txt
return 0;
}
格式化读写:
#include <stdio.h>
int printf(const char *format, ...); //相当于fprintf(stdout,format,…);
int scanf(const char *format, …);
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, …);
int sprintf(char *str, const char *format, ...); // eg: sprintf(buf,”the string is;%s”,str);
int sscanf(char *str, const char *format, …);
以f开头的将格式化后的字符串写入到文件流stream中
以s开头的将格式化后的字符串写入到字符串str中
注意:
读写:从内存的角度而言的。

输入输出:从人的角度而言。

读:也就是输入,表示数据从其它的地方传输到内存
写:也就是输出,表示数据从内存传输到其它的地方
这里的“其它的地方”指:硬盘(文件)键盘显示器,以及各种外设等。

#include <stdio.h>
int main()
{
char buf[50] = {0};
FILE *fp = fopen("a.txt", "r+");
fscanf(fp, "%s", buf);
printf("buf = %s\n", buf);
char buf1[50] = "world";
fprintf(fp, "abc: %s\n", buf1);
fclose(fp);
return 0;
}
单个字符读写:
使用下列函数可以一次读写一个字符
#include <stdio.h>
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
int getc(FILE *stream); →等同于fgetc(FILE* stream)
int putc(int c, FILE *stream); →等同于fputc(int c, FILE* stream)
int getchar(void); →等同于fgetc(stdin);
int putchar(int c); →等同于fputc(int c, stdout);
fgetc从文件中读取一个字符,成功后返回这个字符,读完了返回EOF。

失败了返回-1 getchar和putchar从标准输入输出流中读写数据,其他函数从文件流stream中读写数据。

#include <stdio.h>
int main()
{
char ch;
FILE *fp = fopen("a.txt", "r+");
ch = fgetc(fp);
printf("ch = %c\n", ch);
fputc('B', fp);
fclose(fp);
return 0;
}
字符串读写:
char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
int puts(const char *s); →等同于fputs(const char *s, int size, stdout);
char *gets(char *s); →等同于fgets(const char *s, int size, stdin);
fgets和fputs从文件流stream中读写一行数据;
puts和gets从标准输入输出流中读写一行数据。

fgets可以指定目标缓冲区的大小,所以相对于gets安全,但是fgets调用时,如果文件中当前行的字符个数大于size,则下一次fgets调用时,将继续读取该行剩下的字符,fgets读取一行字符时,保留行尾的换行符。

fputs不会在行尾自动添加换行符,但是puts会在标准输出流中自动添加一换行符。

示例:
#include <stdio.h>
int main()
{
char buf[50] = {0};
FILE *fp = fopen("a.txt", "r+");
fgets(buf, 5, fp);
printf("buf = %s\n", buf);
fputs("1234567", fp);
fclose(fp);
return 0;
}
文件定位:
文件定位指读取或设置文件当前读写点,所有的通过文件指针读写数据的函数,都是从文件的当前读写点读写数据的。

常用的函数有:
#include <stdio.h>
int feof(FILE * stream); //通常的用法为while(!feof(fp))
int fseek(FILE *stream, long offset, int whence);//设置当前读写点到偏移whence 长度为offset处long ftell(FILE *stream); //用来获得文件流当前的读写位置
void rewind(FILE *stream); //把文件流的读写位置移至文件开头→fseek(fp, 0, SEEK_SET);
feof判断是否到达文件末尾的下一个(注意到达文件末尾之后还会做一次)
fseek设置当前读写点到偏移whence 长度为offset处,whence可以是:
SEEK_SET (文件开头→0)
SEEK_CUR (文件当前位置→1)
SEEK_END (文件末尾→2)
ftell获取当前的读写点
rewind将文件当前读写点移动到文件头
fseek使用示例:
#include <stdio.h>
int main()
{
char buf[50] = {'h','e','l','l','o'};
FILE *p;
p = fopen("a.txt", "r+b");。

fwrite(buf, 1, 5, p);
char buf1[50] = {0};
fseek(p, 0, SEEK_SET);
fread(buf1, 1, 5, p);
printf("buf1:%s\n", buf1);
fclose(p);
return 0;
}
注:基于文件指针的文件操作请参考《C语言文件操作常用函数详解.doc》
标准输入/输出流
系统为每个进程预先打开了三个特殊的文件,对应的三个文件指针分别为:stdin(标准输入)、stdout(标准输出)、stderr(标准出错)。

定义在头文件<stdio.h>中。

在进程一开始运行,就自动打开了三个对应设备的文件,它们是标准输入、输出、错误流,分别用全局文件指针stdin、stdout、stderr表示,它们都是FILE *类型。

stdin具有可读属性,缺省情况下是指从键盘的读取输入,stdout和stderr具有可写属性,缺省情况下是指向屏幕输出数据。

#include <stdio.h>
int main()
{
char szBuf[32];
printf("Input string:");
fread(szBuf, 1, 5, stdin);
fwrite(szBuf, 1, 5, stdout);
fwrite(szBuf, 1, 5, stderr);
return 0;
}。

相关文档
最新文档