(C/C++学习)2.C语言中文件流操作基本函数总结
函数所在头文件:stdio.h
说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析。文中部分引用自王桂林老师的C/C++课件。
1.FIELE *fopen(const char*filename,const char *mode)
以mode的方式,打开一个以filename(指针类型)命名的文件,返回一个指向该文件缓冲区的指针,该指针是后续操作的句柄。
2.int fclose(FILE *stream)
fclose()用来关闭先前用fopen()打开的文件。并让文件缓冲区的数据写入文件中,并释放系统提供的文件资源。成功范返回0;失败返回-1(EOF)。
示例1:
#include <stdio.h> int main()
{
FILE * fp = fopen("data.txt", "w");
//以"w"的方式打开一个名为"data.txt"的文件,文件不存在则创建 //判断文件是否都打开成功
if(fp == NULL)
{
printf("open error!\n");
return -1;
}
fputs("china is great!!", fp);
//向文件中写入"chia is great!!"
fclose(fp);
//关闭文件
return 0;
}
//该程序运行完毕,在该工程目录下生成了一个"data.txt"的文本文件,其内容为上述字符串
3.int fputc(int ch,FILE *stream)
将ch字符写入文件,成功返回写入字符,失败返回-1。
int fputs(char *str,FILE *fp)
将str指向的字符串写入fp指向的文件中,正常返回0;失败返回1. 示例2:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char ch;
for(ch = 'a'; ch<='z'; ch++)
printf("%3c",fputc(ch,fp));
//将字符写入文本的同时,将其打印出来
fclose(fp);
return 0;
}
程序运行结果:
同时,也在工程目录下生成了一个叫"data.txt"的文件,打开文件可以发现其内容为a~z。
4.int fgetc(FILE *stream)
从文件流中读取一个字符并返回。成功返回读取的字符;读到文件末尾或失败返回-1。
char *fgets(char *str,int length,FILE *fp)
从fp指向的文件中,至多读length-1个字符,送入数组str中,如果在读入length-1个字符结束前遇到\n或EOF,读入即结束,字符串读入后在最后加一个'\0'字符。正常返回str指针,出错或遇到文件结尾,返回NULL指针。
示例3:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","r");
//data.txt内容为a~z
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char ch;
while((ch = fgetc(fp)) != EOF)
printf("%3c",ch);
fclose(fp);
return 0;
}
程序运行结果:
5.int feof(FILE *stream)
判断文件是否读到末尾,未读到末尾返回0,读到末尾返回非0。一般不用,文件读到结尾,再去读一次,容易导致多读一次。不建议使用!
6.int fread(void* buffer,int num,int count,FILE *fp)
int fwrite(void*buffer,int num,int count,FILE *fp)
将buffer指向的数据写入fp指向的文件中,或是把fp指向的文件中的数据读到buffer中,num为每个要读写的字段数的字节数,count为要读写的字段数。成功返回读/写的字段数(count);出错或文件结束返回0。这两个函数不同于其它 函数,当我们试图用fread/fwrite去读写文本文件的时候,发现文本中的格式己经没有任何意义,只是一个普通的字符。它所进行的操作为二进制操作,通俗来说就是对一些文本标识符如'\0','\n'等已经不敏感了,这些文本标识符都被当做成一个二进制来读写。
7.void rewind(FILE *STREAM)
将文件指针重新指向一个流的开头。
8.int ftell(FILE *stream)
得到流文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数。失败返回-1。
9.int fseek(FILE *stream,long offset,int where)
偏移文件指针,成功返回0,失败返回-1。where是偏移的起始位置。
//#define SEEK_CUR 1 当前位置
//#define SEEK_END 2 文件结尾
//#define SEEK_SET 0 文件开头
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,-100,2);把fp指针退回到离文件结尾100字节处。 示例4:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char ch;
for( ch = 'a'; ch<='z'; ch++)
{
fputc(ch,fp);
}
rewind(fp);
//此处一定不能少,否则文件指针将指向文件末尾,而打印不出任何东西 while((ch = fgetc(fp))&& !feof(fp))
{
printf("%3c",ch);
}
fclose(fp);
return 0;
}
程序运行结果:
示例5:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
fputs("abcd\nefg",fp);
rewind(fp);
char ch;
while((ch = fgetc(fp)) != EOF)
printf("%c",ch);
fclose(fp);
return 0;
}
程序运行结果:
示例6:下面是一个很有意思的程序,请判断下fgets()共执行了多少次;先别看答案,相信这个理解了,这部分问题就不会太大,下面直接上程序:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","r");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
char buf[10] = {0};
int count = 0;
while(fgets(buf,10,fp) != NULL) //注意,即使没遇到结束符,每次也只能读9个字符
{
printf("%s",buf);
count++;
}
fclose(fp);
putchar(10);
printf("+++++++++%d++++++++++",count);
return 0;
}
其中data.txt是这样的:
程序运行结果:
从运行结果来看,似乎是执行了5次,但仔细看看,真的是5次吗?实际上,每读取一次,判断返回的指针是否为空,若不为空,则count加1,若为空,则不执行循环体。因此,实际上是读取了6次,只是最后一次读取后发现到了文件末尾,因此返回来一个空指针,判断为空指针没执行count++操作。值得注意的是fgets()每次读取的字符数。
示例7:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
} fputs("china is great!!",fp); int i = ftell(fp);
printf("%d\n",i);
//打印当前指针位置离文件头的字节数
rewind(fp);
//让文件指针指向文件头
i = ftell(fp);
printf("%d\n",i); char buf[20] = {0};
fgets(buf,20,fp);
printf("%s\n",buf);
fclose(fp);
return 0;
}
程序运行结果:
示例8:
#include <stdio.h>
int main()
{
FILE* fp = fopen("data.txt","w+");
if(fp == NULL)
{
printf("open error\n");
return -1;
}
fputs("china is great!!",fp);
fseek(fp,2,0);
//将文件指针偏移到离文件头两个字节的位置
char buf[20];
fgets(buf,20,fp);
printf("%s\n",buf);
fclose(fp);
return 0;
}
程序运行结果:
示例9:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fpw = fopen("bin.txt","wb+");
if(fpw == NULL)
return -1;
char *p = "china \n is \0 great";
fwrite(p,1,strlen(p)+7,fpw);
//将指针的内容写入到文件中,由于strlen()所求长度
//遇到0截止,因此需将0后面的元素补上。 rewind(fpw);
char buf[1024];
int n = fread(buf,1,1024,fpw);
//每次读取一个字节,读取1024次,返回读取的字段数(此处为字节数)
//遇到文件末尾或读取错误返回0
printf("%d\n",n);
int i = 0;
for(i = 0;i<n;i++)
printf("%c",buf[i]);
fclose(fpw);
return 0;
}
程序运行结果:
(C/C++学习)2.C语言中文件流操作基本函数总结的更多相关文章
- c语言中文件相关操作
一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本 ...
- c#基础语言编程-文件流操作
引言 在System.IO 命名空间下提供了一系列的类,我们可以通过相应的类进行文件.目录.数据流的操作. 1.File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 2.File ...
- C++中文件流操作
一.C++中流和流操作符 C++中把数据之间的传输操作称为流,流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流.C++输入输出除了 ...
- c语言中文件的操作
所谓“文件”是指一组相关数据的有序集合.这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等. 文件通常是驻留在外部 ...
- C语言中文件定位函数总结
C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...
- ndk学习之c++语言基础复习----C++容器、类型转换、异常与文件流操作
继续来复习C++,比较枯燥,但是这是扎实掌握NDK开发的必经之路,不容小觑. 容器: 容器,就是用来存放东西的盒子. 常用的数据结构包括:数组array, 链表list, 树tree, 栈stack, ...
- C语言对文件的操作函数用法详解2
fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const ...
- C语言对文件的操作函数用法详解1
在ANSIC中,对文件的操作分为两种方式,即: 流式文件操作 I/O文件操作 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: typedef str ...
- .NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常)
.NET客户端下载SQL Server数据库中文件流保存的大电子文件方法(不会报内存溢出异常) 前段时间项目使用一次性读去SQL Server中保存的电子文件的文件流然后返回给客户端保存下载电子文件, ...
随机推荐
- TRIZ的成功案例
这篇採訪稿是几年前的,是TRIZ成功案例离我近期的,由于主人公是我的朋友,请点击查看: 培训后技术难题就攻克了 后记:学了TRIZ并不能让您100%解决您全部遇到的问题,但这样的思想和方法确实是最具操 ...
- Android之QQ授权登录获取用户信息
有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...
- pytest 失败用例重试
https://www.cnblogs.com/jinzhuduoduo/articles/7017405.html http://www.lxway.com/445949491.htm https: ...
- WinForm中的ListBox组件编程
ListBox组件是一个程序设计中经常使用到的组件,在Visual C#和Visual Basic .Net程序中使用这个组件,必须要在程序中导入.Net FrameWork SDK中名称空间Syst ...
- Codeforces--630K--Indivisibility(容斥)
K - Indivisibility Crawling in process... Crawling failed Time Limit:500MS Memory Limit:65536 ...
- hdoj Radar Installation
Problem Description Assume the coasting is an infinite straight line. Land is in one side of coastin ...
- B1786 [Ahoi2008]Pair 配对 逆序对+dp
这个题有点意思,一开始没想到用dp,没啥思路,后来看题解才恍然大悟:k才1~100,直接枚举每个-1点的k取值进行dp就行了.先预处理出来sz[i][j] i左边的比j大的数,lz[i][j] i ...
- Flink之DataStreamAPI入门
目录 Types Transformations Defining UDFs 本文API基于Flink 1.4 def main(args: Array[String]) { // 第一种会自动判断用 ...
- Coursera Algorithms week2 基础排序 练习测验: Permutation
题目原文: Given two integer arrays of size n , design a subquadratic algorithm to determine whether one ...
- php函数 array_values()
array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名. 提示:被返回的数组将使用数值键,从 0 开始并以 1 递增. $a=array("Name" ...