前言
-
每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统定义的,取名为FILE。FILE是头文件stdio.h中定义的一个结构体,结构如下:
struct iobuf {
char *ptr;
int cnt;
char *base;
int flag;
int _file;
int _charbuf;
int _bufsiz;
char *tmpfname;
};
typedef struct _iobuf FILE;
-
EOF为stdio.h头文件中声明的宏,值为-1。
一、字符读取
1、fgetc函数
fgetc函数从文件流里取出下一个字节并把它作为一个字符(无符号字符)返回。当它到达文件尾或出现错误时,返回EOF,必须通过ferror或feof区分两种情况。
1)引用头文件
#include<stdio.h>
2)函数原型
int fgetc(FILE *stream)
3)参数 stream
这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
4)返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
5) 案例
#include <stdio.h>
#include <stdlib.h>
int main ()
{
FILE *fp;
int c;
int n = 0;
fp = fopen("test.txt","r");
if(fp == NULL)
{
perror("打开文件时发生错误");
exit(1);
}
if(ferror(fp))
{
printf("Error to read the file\n");
exit(-1);
}
do
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
printf("%c", c);
}while(1);
fclose(fp);
return 0;
}
假设有一个文本文件test.txt,它的内容如下。文件将作为实例中的输入:
I have a dream!
编译并运行上面的程序,产生如下结果:
I have a dream!
2、getc函数
getc函数从文件流里取出下一个字节并把它作为一个字符(无符号字符)返回。当它到达文件尾或出现错误时,返回EOF,必须通过ferror或feof区分两种情况。
1) 引用头文件
#include<stdio.h>
2)函数原型
int getc(FILE *stream)
3)参数 stream
这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
4)返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
5) 案例
#include<stdio.h>
int main()
{
char cvar;
printf("请输入字符:");
cvar = getc(stdin);
printf("输入的字符:");
putc(cvar, stdout);
return 0;
}
程序执行结果如下:
请输入字符:p
输入的字符:p
注:getc函数的作用和fgetc一样,但它有可能被实现为一个宏,如果这样,stream参数就可能被计算不止一次,所以它不能有副作用(例如不能影响变量)。此外,也不能保证能够使用getc的地址作为一个函数指针。
3、getchar函数
C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于 getc 带有 stdin 作为参数。
1)引用头文件
#include<stdio.h>
2)函数原型
int getchar(void)
3)参数NA
4)返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
5) 案例
#include <stdio.h>
int main ()
{
char c;
printf("请输入字符:");
c = getchar();
printf("输入的字符:");
putchar(c);
return(0);
}
程序执行结果如下:
请输入字符:s
输入的字符:s
4、fgets函数
该函数从指定的流 stream 读取一行,并把它存储在 s 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时(它会把遇到的换行符也传递到接收字符串里,再加上一个表示结尾的空字节\0),或者到达文件末尾时,它会停止。
1)引用头文件
#include<stdio.h>
2)函数原型
char *fgets(char *s, int n, FILE *stream)
3)参数
-
s -- 这是一个指向字符数组的指针,该数组存储了要读取的字符串。
-
n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 s传递的数组长度。
-
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
4)返回值
当成功完成时,fgets返回指向字符串s的指针。如果文件流已到达文件尾,fgets会设置这个文件流的EOF标识并返回一个空指针。如果出现读错误,fgets返回一个空指针并设置errno以指示出错的类型。
5) 案例
#include <stdio.h>
int main()
{
FILE *fp;
char s[1024];
/* 打开用于读取的文件 */
fp = fopen("test.txt" , "r");
if(fp == NULL) {
perror("打开文件时发生错误");
return -1;
}
if( fgets (s, 1024, fp)!=NULL ) {
/* 向标准输出 stdout 写入内容 */
puts(s);
}
fclose(fp);
return 0;
}
假设我们有一个文本文件 test.txt,它的内容如下。文件将作为实例中的输入:
Today is 2020
程序运行输出如下结果:
Today is 2020
5、gets函数
该函数从标准输入 stdin 读取一行,并把它存储在 s 所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止,并且会丢弃遇到的换行符。
1)引用头文件
#include<stdio.h>
2)函数原型
char *gets(char *s)
3)参数
s -- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
4)返回值
如果成功,该函数返回 s。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。
5) 案例
#include <stdio.h>
int main()
{
char str[50];
printf("请输入一个字符串:");
gets(str);
printf("输入的字符串是:%s", str);
return(0);
}
程序运行输出结果如下:
请输入一个字符串:abcdefg
输入的字符串是:abcdefg
二、字符输出
1、fputc函数
该函数把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
1)引用头文件
#include<stdio.h>
2)函数原型
int fputc(int char, FILE *stream)
3)参数
-
char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。
-
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
4)返回值
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
5) 案例
#include <stdio.h>
int main ()
{
int c;
FILE *fd;
fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","r");
if(fd == NULL)
{
perror("文件打开出错!\n");
return -1;
}
c = fgetc(fd);
while(c != EOF)
{
fputc(c,stdout);
c=fgetc(fd);
}
fclose(fd);
return 0;
}
程序运行输出结果如下:
I have a dream!
2、putc函数
该函数把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
1)引用头文件
#include<stdio.h>
2)函数原型
int putc(int char, FILE *stream)
3)参数
-
char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。
-
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
4)返回值
该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。
5) 案例
#include <stdio.h>
int main ()
{
int c;
FILE *fd;
fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","r");
if(fd == NULL)
{
perror("文件打开出错");
return -1;
}
c = fgetc(fd);
while(c != EOF)
{
putc(c,stdout);
c=fgetc(fd);
}
fclose(fd);
return 0;
}
程序运行输出结果如下:
I have a dream!
3、putchar函数
该函数把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中,相当于putc(c,stdout)。
1)引用头文件
#include <stdio.h>
2)函数原型
int putc(int char, FILE *stream)
3)参数
char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。
4)返回值
该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。
5) 案例
#include <stdio.h>
int main ()
{
char ch;
for(ch = 'A' ; ch <= 'Z' ; ch++) {
putchar(ch);
}
return 0;
}
程序运行输出结果如下:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
4、fputs函数
该函数把字符串写入到指定的流 stream 中,但不包括空字符。
1)引用头文件
#include <stdio.h>
2)函数原型
int fputs(const char *str, FILE *stream)
3)参数
-
str -- 这是一个字符数组,包含了要写入的以空字符终止的字符序列。
-
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
4)返回值
该函数返回一个非负值,如果发生错误则返回 EOF。
5) 案例
#include <stdio.h>
int main ()
{
int c;
FILE *fd;
fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","w+");
char *s = "c语言程序设计\n";
fputs(s,fd);
fputs("python实战",fd);
fclose(fd);
return 0;
}
程序运行输出结果如下:
c语言程序设计
python实战
5、puts函数
该函数把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。
1)引用头文件
#include <stdio.h>
2)函数原型
int puts(const char *str)
3)参数
str -- 这是要被写入的 C 字符串。
4)返回值
如果成功,该函数返回一个非负值,如果发生错误则返回 EOF。
5) 案例
#include <stdio.h>
int main ()
{
int c;
FILE *fd;
fd = fopen("D:\\code\\vscode\\c\\practise\\file.txt","w+");
char *s = "c语言程序设计\n";
puts(s);
fclose(fd);
return 0;
}
程序运行输出结果如下:
c语言程序设计