文件输入/输出函数

一、检查命令行参数

          具体参考:C语言命令行参数讲解_哆啦A梦的_梦的博客-CSDN博客

二、fopen()函数

        fopen()函数用来打开文件。该函数声明在stdio.h中。它的1个参数待打开文件的名称,更确切地说是一个包含该文件名的字符串地址。第 2 个参数是一个字符串,指定待打开文件的模式

        程序成功打开文件后,fopen()将返回文件指针(file pointer),其他I/O函数可以使用这个指针指定该文件。文件指针(该例中是fp)的类型是指向FILE的指针,FILE是一个定义在stdio.h中的派生类型。

三、getc()和putc()函数

        getc()和putc()函数与getchar()putchar()函数类似。所不同的是,要告诉getc()putc()函数使用哪一个文件。下面这条语句的意思是从标准输入中获取一个字符

ch = getchar();

        然而,下面这条语句的意思是“fp指定的文件中获取一个字符

ch = getc(fp);

        与此类似,下面语句的意思是“把字符ch放入FILE指针fpout指定的文件中

putc(ch, fpout);

        在putc()函数的参数列表中,1个参数是待写入的字符,第2个参数是文件指针。

代码示例:

putc(ch, stdout);  //与putchar(ch);相同

        把stdout作为putc()的第2个参数。stdout作为与标准输出相关联的文件指针,定义在stdio.h中,所以putc(ch, stdout)putchar(ch)的作用相同。实际上,putchar()函数一般通过putc()来定义。与此类似,getchar()也通过使用标准输入的getc()来定义。

四、文件结尾

        从文件中读取数据的程序在读到文件结尾时要停止。如何告诉程序已经读到文件结尾?如果 getc()函数在读取一个字符时发现是文件结尾,它将返回一个特殊值EOF。所以C程序只有在读到超过文件末尾时才会发现文件的结尾(一些其他语言用一个特殊的函数在读取之前测试文件结尾,C语言不同)。

        为了避免读到空文件,应该使用入口条件循环(不是do while 循环(出口循环))进行文件输入。鉴于getc() (和其他 C 输入函数)的设计,程序应该在进入循环体之前先尝试读取。如下面设计所示:
int ch; // 用int类型的变量储存
EOF FILE * fp; 
fp = fopen("wacky.txt", "r"); 
ch = getc(fp); // 获取初始输入 
while (ch != EOF) 
{
   putchar(ch); // 处理输入 
   ch = getc(fp); // 获取下一个输入
}

 进行简化:

int ch; 
FILE * fp; 
fp = fopen("wacky.txt", "r"); 
while (( ch = getc(fp)) != EOF) 
{
  putchar(ch); //处理输入 
}
        由于ch = getc(fp) while 测试条件的一部分,所以程序在进入循环体之前就读取了文件。

五、fclose函数

        fclose(fp)函数关闭fp指定的文件,必要时刷新缓冲区。对于较正式的程序,应该检查是否成功关闭文件。如果成功关闭,fclose()函数返回0,否则返回EOF

if (fclose(fp) != 0)

printf("Error in closing file %s\n", argv[1]);

        如果磁盘已满、移动硬盘被移除或出现I/O错误,都会导致调用fclose()函数失败。

六、指向标准文件的指针

        stdio.h头文件把3个文件指针与3个标准文件相关联,C程序会自动打开这3个标准文件。如表所示:

 这些文件指针都是指向FILE的指针,所以它们可用作标准I/O函数的参数,如fclose(fp)中的fp

七、fprintf()函数和fscanf()函数

        文件I/O函数 fprintf() fscanf() 函数的工作方式与 printf() scanf() 类似,区别在于前者需要用第1 个参数指定待处理的文件。
        与putc()、getc()函数不同的是,fprintf() fscanf() 函数都把 FILE 指针作为第 1 个参数,而不是最后一个参数。
更多,具体参考: https://www.jb51.net/article/227130.htm
        在C语言中常用使用的打印函数是printf()函数,这个多用于给控制台打印数据,如果需要将内容直接打印到某个文件中的时候,可以使用fprintf()函数。它有两个参数,第一个参数为待写入的文件指针,第二个参数为待写入的内容。
        scanf()函数用于从键盘读取数据,fscanf()函数则用来从文件中读取数据。比如可以将上面的例子修改为,使用fscanf()函数从文件中读取数据。这里fscanf()中有三个参数,第一个参数是要读取的文件指针,第二个参数是要读取数据的格式,第三个参数是读取的数据存放位置。

八、fgets()和fputs()函数

fgets()函数
        第1个参数和gets() 函数一样,也是表示储存输入位置的地址(char * 类型);第 2 个参数是一个整数,表示待输入字符串的大小 [1] ;最后一个参数是文件指针,指定待读取的文件。下面是一个调用该函数的例子:
fgets(buf, STLEN, fp);
        这里,buf是 char 类型数组的名称, STLEN 是字符串的大小, fp 是指向FILE的指针。
        fgets()函数读取输入直到第 1 个换行符的后面,或读到文件结尾,或者读取STLEN-1 个字符(以上面的 fgets() 为例)。然后, fgets() 在末尾添加一个空字符使之成为一个字符串。字符串的大小是其字符数加上一个空字符。 如果fgets() 在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。fgets() 函数在遇到 EOF 时将返回 NULL 值,可以利用这一机制检查是否到达文件结尾;如果未遇到EOF 则之前返回传给它的地址。
fputs()函数
        fputs()函数接受两个参数:第 1 个是字符串的地址;第 2 个是文件指针。该函数根据传入地址找到的字符串写入指定的文件中。和 puts() 函数不同,fputs()在打印字符串时不会在其末尾添加换行符。下面是一个调用该函数的 例子:
fputs(buf, fp);
        这里,buf是字符串的地址, fp 用于指定目标文件。
        由于fgets() 保留了换行符, fputs()就不会再添加换行符,它们配合得非常好。

九、fread和fwrite函数

具体参考:C语言fread和fwrite的用法详解(以数据块的形式读写文件)


        fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:

size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

        fwrite() 函数用来向文件中写入块数据,它的原型为:

size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );

对参数的说明:

  • ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
  • size:表示每个数据块的字节数。
  • count:表示要读写的数据块的块数。
  • fp:表示文件指针。
  • 理论上,每次读写 size*count 个字节的数据。


size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值