前言

面向字符操作。

这两个函数类似于getchar()和puchar(‘ch’)。

区别

在后面加多一个参数(FILE指针)

函数

fopen()

  1. 函数声明:在stdio.h中
  2. 参数
    (文件名,读写等模式)
  3. 返回:文件指针
    FILE * fp;

    文件指针并不指向实际的文件,它指向一个包含文件信息的数据对象,其中包含I/O函数所用的缓冲区信息。

getc()

类似于getchar()

  1. 参数
    (FILE指针)
  2. 返回:文件中的一个字符

    与getchar()函数类似,getchar()是从标准输入中获取字符。而,getc()是从指定文件中获取字符

putc()

类似于putchar()

  1. 参数
    (一个字符,FILE指针)
  2. 作用
    将这个字符放入指定的文件中

exit()

  1. 函数声明:在stdlib.h头文件中
  2. 参数
    正常结束传递0,非正常传递非0值.
  3. 作用
    关闭所有打开文件,并结束程序

    与return 不同的是:在main()以外的函数中调用exit()也能结束整个程序

fclose()

  1. 参数
    FILE指针
  2. 作用
    关闭指定文件
  3. 返回
    成功关闭:0
    不成功:EOF

示例

将文件copy到其他文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<stdio.h>
#include<stdlib.h>//提供exit()的原型
int main(int argc, char*argv[])
{
FILE *in;//要被复制的文件指针
FILE *out;//要复制到的文件指针
int ch;//存储每个字符
int count = 0;//计数

if (argc != 3)//如果参数不是3就退出
{
printf("Usage: %s filename", argv[0]);
exit(EXIT_FAILURE);
}
if ((in = fopen(argv[1], "r")) == NULL)//如果argv[1]是空指针,就退出
{
printf("Can't open %s", argv[1]);
exit(EXIT_FAILURE);
}
if ((out = fopen(argv[2], "w+")) == NULL)//如果argv[2]是空指针,就退出
{
printf("Can't open %s", argv[2]);
exit(EXIT_FAILURE);
}

while((ch = getc(in)) != EOF)//循环读入一个字符,直到文件结尾
{
putc(ch, out);//将这个字符放入FILE指针指定的文件中
count++;//增加计数
}
if (fclose(in) != 0);//关闭文件
printf("Error in closing file %s\n", argv[1]);

printf("File %s has %lu characters\n", argv[1], count);

return 0;
}
转换为大写文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define SIZE 40
char * s_gets(char * st, int n);

int main(void)
{
FILE * fs; //原始文件指针
FILE * ft; //目标文件指针
char name_s[SIZE];
char name_t[SIZE];
char ch;

//输入原始文件和目标文件名
fprintf(stdout, "Please enter the source file name:\n");
s_gets(name_s, SIZE);
fprintf(stdout, "Please enter the target file name:\n");
s_gets(name_t, SIZE);

//打开原始文件和目标文件
if ((fs = fopen(name_s, "r")) == NULL)
fprintf(stderr, "Could not open the %s\n", name_s);
if ((ft = fopen(name_t, "w")) == NULL)
fprintf(stderr, "Could not open the %s\n", name_t);

//拷贝数据
while ((ch = getc(fs)) != EOF)
putc(toupper(ch), ft);

fclose(fs);
fclose(ft);

return 0;
}

//自定义读取文件名的函数
char * s_gets(char * st, int n)
{
char * find;
char * ret_val;

ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n'); //查找换行符
if (find)
*find = '\0'; //替换为空字符
else
while (getchar() != '\n')
continue; //处理多余输入
}

return ret_val;
}
输出文件内容(命令行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char * argv[])
{
FILE *fp;
int i;
char ch;
if(argc == 1)
{
fprintf(stderr, "Usage: %s filename", argv[0]);
exit(EXIT_FAILURE);
}

for (i = 1; i < argc; i++)
{
if((fp = fopen(argv[i], "r")) == NULL)//判断文件存在,并赋值给文件指针
{
fprintf(stderr, "Cound not open %s file", argv[i]);
exit(EXIT_FAILURE);
}
while ((ch = getc(fp)) != EOF)
{
putc(ch, stdout);
}
printf("\n");

}
return 0;
}