大家好,又见面了,我是你们的朋友全栈君。
文件是一段数据的集合,这些数据可以是有规则的,也可以是无序的集合。在stdio.h有一个非常重要的东西,文件指针,每个文件都会在内存中开辟一块空间,用于存放文件的相关信息,这些信息保存在一个结构体中: struct _iobuf { char *_ptr; //指向buffer中第一个未读的字节 int _cnt; //记录剩余的未读字节的个数 char *_base;//文件的缓冲 int _flag;//打开文件的属性 int _file;//获取文件描述 int _charbuf;//单字节的缓冲,即缓冲大小仅为1个字节 int _bufsiz;//记录这个缓冲大小 char *_tmpfname;//临时文件名 }; typedef struct _iobuf FILE; FILE是一个数据结构,用于访问一个流。每个流都会对应一个FILE结构体。
C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:
参数解释: “r”:以只读的形式打开文本文件(不存在则出错) “w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容) “a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加) “r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间) “wb”:以只写的形式打开二进制文件 “rb”:以只读的形式打开二进制文件 “ab”:以追加的形式打开一个二进制文件 “rb+”:以读写的形式打开二进制文件。 “w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失) “a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读 “wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置 “ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置
打开文件 FILE *fopen( const char *filename, const char *mode );
例:
int main()
{
FILE* f;
f = fopen("file.txt", "w");
if (f != NULL)
{
fputs("fopen example", f);
fclose(f);
f=NULL;
}
return 0;
}
注意:
关闭文件 函数原型:int fclose( FILE *stream );
例:
if(fclose(f)!=0)
{
printf("File cannot be closed/n");
exit(1);
}
else
{
printf("File is now closed/n");
}
读取字符 int fgetc ( FILE * stream );
例:
#include <stdio.h>
int main ()
{
FILE * pFile;
int c;
int n = 0;
pFile = fopen ("D:\\myfile.txt", "r");
if (pFile == NULL) perror ("Error opening file"); // 打开失败
else
{
while (c != EOF)
{
c = fgetc (pFile); // 获取一个字符
if (c == '$') n++; // 统计美元符号 '$' 在文件中出现的次数
}
fclose (pFile); // 一定记得要关闭文件
printf ("The file contains %d dollar sign characters ($).\n",n);
}
return 0;
}
写入字符 int fputc( int c, FILE *stream );
例:
char ch;
FILE* pf = fopen("file.txt", "w");
if (pf == NULL)
{
perror("error opening file");
exit(0);
}
ch = getchar();
while (ch != '$')
{
fputc(ch, pf);
ch = getchar();
}
fclose(pf);
读取字符串 char * fgets ( char * str, int num, FILE * stream );
例:
char buf[10] = {
0 };
FILE *pf = fopen("file.txt", "r");
if (pf == NULL)
{
perror("open file for reading");
exit(0);
}
fgets(buf, 9, stdin);
printf("%s", buf);
fclose(pf);
写入字符串 int fputs( const char *string, FILE *stream );
例:
char buf[10] = {
0 };
FILE *pf = fopen("file.txt", "r");
if (pf == NULL)
{
perror("open file for reading");
exit(0);
}
fgets(buf, 9, stdin);
fputs(buf, stdout);
fclose(pf);
读取数据块 size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
例:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *pFile = fopen("file.txt", "rb");
if (pFile == NULL)
{
perror ("Error opening file");
return 0;
}
char buf[100] = {
0 };
while (!feof(pFile)) //没有到文件末尾
{
memset(buf, 0, sizeof(buf));
size_t len = fread(buf, sizeof(char), sizeof(buf), pFile);
printf("buf: %s, len: %d\n", buf, len);
}
fclose(pFile);
}
写入数据块 size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); 同理,简单好理解,就不详细阐述了。
文件指针重定位 int fseek ( FILE * stream, long int offset, int origin );
获取指针位置 long int ftell ( FILE * stream );
获取文件大小 例:
long n;
fseek(pf,0,SEEK_END);
n=ftell(pf);
文件指针移到开始处 void rewind( FILE *stream );
清除文件错误标志 void clearerr( FILE *stream );
文件流是否读到了文件尾 int feof( FILE *stream );
重命名文件 int rename ( const char * oldname, const char * newname );
删除文件 int remove ( const char * filename );
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137033.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有