基于流的文件IO

示例:复制文件到另外的文件,注意,hello.txt必须存在文本才能看到结果

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 int main(void)
 5 {
 6     FILE *fp1, *fp2;
 7     int c;
 8
 9     if((fp1=fopen("hello.txt","rb"))==NULL)
10     {
11         printf("error to read\n");
12         exit(1);
13     }
14     if((fp2=fopen("desk.txt","wb"))==NULL)
15     {
16         printf("fails to open file 2");
17         exit(1);
18     }
19
20     while((c=fgetc(fp1))!=EOF)
21     {
22         if(fputc(c,fp2)==EOF)
23         {
24             printf("error to print\n");
25             exit(1);
26         }
27     }
28     fclose(fp1);
29     fclose(fp2);
30     return 0;
31 }

可以看出,基本上

打开文本文件使用:

fopen()函数,

使用fclose()关闭文本;使用fgetc从文本中获取文本

使用fputs将文本写入流,因此fp2处也可以是stdout,此时会将文件内容写出到标准输出;

1.

字符的读取

#include<stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);

使用getchar时,通过Ctrl+D可以发送EOF信号

2.

字符的输出

#include<stdio.h>
int putc(int c,FILE *fp);
int fputc(int c,FILE *fp);
int putchar(void);

putchar和getchar的定义类似

3.

基于行的IO

输入:

#include<stdio.h>
char *fgets(char *buf,int n,FILE *fp);
char *gets(char *buf);

返回的是缓冲区的首地址,n为指定要读取的字符数,gets是从标准输入读取

注意,fgets遇到\n就不读取了,保证最后一位为‘\0’,也就是说,最后缓冲区最多只有n-1个字符被读入,最后一位是\0

gets函数是一个危险的函数,在gcc中会警告,不建议使用。

因为gets不检查输入的数目,因此可能造成溢出而使程序崩溃。

输出:

#include<stdio.h>
int fputs(const char *buf,FILE *restrict fp);
int puts(const char *str);

restrict是C99的新标准,表示限定地址的指针访问,就是只能使用fp这个指针访问此地址,其他指向此地址的指针都无效

puts安全性也不高,因此也不建议使用。

4.

直接IO

#include<stdio.h>
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *fp);
size_t fwrite(const void *ptr,size_t size, size_t nmemb,FILE *fp);

这两个函数用于读写块和对象可以这样使用

将数组的一部分写入到流中

if(fwrite(&data[2],sizeof(float),4,fp)!=4)
    {
        printf("error");
        exit(1);
    }

将结构写入文件

    struct
    {
        short count;
        long total;
        char name[20];
    }item;

    if(fwrite(&item,sizeof(item),1,fp)!=1)
    {
        printf("error\n");
    }

结合起来就是可以读写结构数组

典型应用就是通讯录的读取和写入

下面是用直接IO的方式复制文件的示例:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 #define SRC "hello.txt"
 5 #define DES "des.txt"
 6
 7 int main(void)
 8 {
 9     FILE *fp1,*fp2;
10     char buf[1024];
11     int n;
12     if((fp1=fopen(SRC,"rb"))==NULL)
13     {
14         printf("error 1\n");
15         exit(1);
16     }
17     if((fp2=fopen(DES,"wb"))==NULL)
18     {
19         printf("error 2\n");
20         exit(1);
21     }
22     while((n=fread(buf,sizeof(char),1024,fp1))>0)
23     {
24         if(fwrite(buf,sizeof(char),n,fp2)==-1)
25         {
26             printf("error 3\n");
27             exit(1);
28         }
29     }
30     if(n==-1)
31     {
32         printf("error 4\n");
33         exit(1);
34     }
35     fclose(fp1);
36     fclose(fp2);
37     return 0;
38 }

5.

格式化IO

#include<stdio.h>

int printf(const char *format,...);
int fprintf(FILE *fp,const char *format,...);

int sprintf(char *str,const char *format,...);
int snprintf(char *str,size_t size,const char *format);//maybe only in Linux

int scanf(const char *format,...);
int fscanf(FILE *fp,const char *format,...);
int sscanf(char *str,const char *format,...);

其他格式化方式参见其他文章

时间: 2024-12-28 12:44:25

基于流的文件IO的相关文章

使用IO流复制文件夹(包括子目录)

IO流用于处理设备上的数据(包括硬盘,内存,键盘录入). IO流可根据流向不同分为输入流和输出流,根据处理数据类型不同分为字节流和字符流. 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本质其实就是基于字节流读取时,去查了指定的码表. 字节流和字符流的区别: a.读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节. b.处理对象不同:字节流能处理所有类型的数据(如图片.avi等),而字符流只能处理字符类型的数据. 结论:

IO流的文件复制

1. IO流的分类 1.根据处理数据类型的不同分为: 字符流:1)Reader 读取字符流的抽象类 常用方法: read() 读取单个字符 read(char[] cbuf) 将字符读入数组. read(char[] cbuf, int off, int len) 将字符读入数组的某一部分. close() 关闭该流并释放与之关联的所有资源. 2)Writer 写入字符流的抽象类 常用方法:write(int c) 写入单个字符. write(String str) 写入字符串 write(St

Java学习记录(补充八:Date类;Java流(Stream),文件(File)和IO)

Date类,Calendar类package Box1; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Random; //Date类 public class DateTest { public static void main(String[] args) { Date

Java:IO流与文件基础

Java:IO流与文件基础 说明: 本文所有内容包含图片均为MrSaber自己编写,转载请练习我哦. 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象称作 输入流,可以向其中写入一个字节序列的对象称作 输出流. ? 这些字节序列的来源可以是:文件.网络连接.内存块等. ? 抽象类InputStream和OutputStream是构成输入/输出(I/O)的基础. ? 因为面向字节的流

java io流(字符流) 文件打开、读取文件、关闭文件

java io流(字符流) 文件打开 读取文件 关闭文件 //打开文件 //读取文件内容 //关闭文件 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ //打开文件 //字符流方式打开 //字符流每次按一个字符读取 FileReader wj = new FileReader("D:/java/kj/javanew/src/Index.java"

java io流 创建文件、写入数据、设置输出位置

java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; public class Index{ public static void main(String[] args) throws Exception{ /** * 存储为二进制,给计算机看的 */ //创建文件 DataOutputStream sjl = new DataOutputStrea

关于java io流操作文件探讨

1.任务描述    2.读取一个字符 3.读取整个文件 4.复制文件 5.复制大文件 6.利用字符流解决乱码问题 一.任务描述 大家都知道程序是程序的运行是离不开内存的,但是很多东西并不在程序当中,而程序也需要操作它们.所以就需要一个东西与内存外的资源打交道,我们就把这个东西称为io流.io流分为输出流和输入流,输出流是将内存中的东西输出到内存之外,输入流是将内存之外的东西读取到内存中.一旦有了io流之后,与内存之外的资源打交道就十分方便了.为什么这么说,其实总体上就只需要三步操作,第一步,定位

基于JavaSE阶段的IO流详解

1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有输入流类都是抽象类,是InputStream或者抽象类Reader的子类:而所有输出流都是抽象类,是OutputStream或者Writer的子类.输入输出流的定义是根据流向所决定的,我们可以是本地为一个实体物质,从外界往本地输入,按照本地的状态就是读取,反之,从本地向外写入就是输出.IO流是最基本

Java中常用IO流之文件流的基本使用姿势

所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流.IO操作比较复杂,涉及到的系统调用比较多,相对操作内存而言性能很低.然而值得兴奋的是,Java提供了很多实现类以满足不同的使用场景,这样的实现类有很多,我只挑选些在日常编码中经常用到的类进行说明,本节主要介绍和文件操作相关的流,下面一起来瞧瞧吧. File File是Java在整个文件IO体系中比较