C语言语法入门-文件处理
9unk Lv5

文件与流

针对文件、画面、键盘等的数据的输入输出操作,都是通过流进行操作的。在计算机系统中是指信息从外部输入设备向计算机内部输入,或者从内存向外部输出设备输出的过程。这种输入输出的过程被形象的比喻为“流”。

数据流就是输入的数据通过缓冲区再从缓冲区向外部输出设备输出。

标准流

输入的数据通常分为三种:

  1. 标准输入流(stdin):输入的数据
  2. 标准输出流(stdout):输出的数据
  3. 标准错误流(stderr):输入的数据有问题导致程序报错

FILE型

1

打开文件

在C中使用fopen函数打开文件。fopen函数需要两个参数。第一个参数是要打开的文件名,第2个参数是文件类型及打开模式。

文件类型有两种,即文本文件和二进制文件。

2

关闭文件

文件使用结束后,就要断开文件与流的关联将流关闭,这个操作称为关闭文件。
3

打开关闭文件示例

代码清单13-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*程序名:list1301.c*/
/*
打开与关闭文件
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <math.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
fp = fopen("abc", "r");
if (fp == NULL)
printf("\a无法打开文件\"abc\"。\n");
else
{
printf("\a成功打开文件\"abc\"。\n");
fclose(fp);
}

return 0;
}

文件数据汇总

4

代码清单13-2

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
/*程序名:list1302.c*/
/*
读入身高和体重,计算并显示他们的平均值
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <math.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
int ninzu = 0; /*人数*/
char name[100]; /*姓名*/
double height, weight; /*身高,体重*/
double hsum = 0.0; /*身高合计*/
double wsum = 0.0; /*体重合计*/

if ((fp = fopen("hw.dat", "r")) == NULL)
printf("\a文件打开失败。\n");
else
{
while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3)
{
printf("%-10s %5.1f %5.1f\n", name, height, weight);
ninzu++;
hsum += height;
wsum += weight;
}
printf("---------------------------\n");
printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);
fclose(fp);
}
return 0;
}

写入时间和日期

5

代码清单13-3

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
/*程序名:list1303.c*/
/*
向文件写出程序运行时的日期和时间
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
time_t current = time(NULL); /*当前日历时间*/
struct tm* timer = localtime(&current); /*分解时间(当地时间)*/

//fopen:如果没有该文件会自动创建文件
if ((fp = fopen("dt_dat", "w")) == NULL)
printf("\a文件打开失败。\n");
else
{
printf("写出当前日期和时间。\n");
fprintf(fp, "%d %d %d %d %d %d\n", timer->tm_year + 1900, timer->tm_mon + 1, timer->tm_mday, timer->tm_hour, timer->tm_min, timer->tm_sec);
fclose(fp);
}
return 0;
}

代码清单13C-1

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
/*程序名:list13C-1.c*/
/*
显示当前日期和时间
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
time_t current = time(NULL);
struct tm* timer = localtime(&current);
char* wday_name[] = { "日","一","二","三","四","五","六" };
printf("当前的日期和时间为 %d 年 %d 月 %d 日(%s) %d 时 %d 分 %d 秒。\n",
timer->tm_year + 1900, /*年*/
timer->tm_mon + 1, /*月*/
timer->tm_mday, /*日*/
wday_name[timer->tm_wday], /*星期*/
timer->tm_hour, /*时*/
timer->tm_min, /*分*/
timer->tm_sec /*秒*/
);

return 0;
}

6
7
8

获取上一次运行的信息

代码清单13-4

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
56
/*程序名:list1304.c*/
/*
显示程序上一次运行的日期和时间
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

char data_file[] = "datetime.dat";

/*---取得并显示上一次运行时的日期和时间---*/
void get_data(void)
{
FILE* fp;
if ((fp = fopen(data_file, "r")) == NULL)
printf("本程序第一次运行。\n");
else
{
int year, month, day, h, m, s;

fscanf(fp, "%d%d%d%d%d%d", &year, &month, &day, &h, &m, &s);
printf("上一次运行是在%d年%d月%d日%d时%d分%d秒。\n", year, month, day, h, m, s);
fclose(fp);
}
}

/*---写入本次运行时的日期和时间---*/
void put_data(void)
{
FILE* fp;
time_t current = time(NULL);
struct tm* timer = localtime(&current);

//fopen 写文件时,如果文件不存在会创建一个新文件
if ((fp = fopen(data_file, "w")) == NULL)
printf("\a文件打开失败。\n");
else
{
fprintf(fp, "%d %d %d %d %d %d\n",
timer->tm_year + 1900,
timer->tm_mon + 1,
timer->tm_mday,
timer->tm_hour,
timer->tm_min,
timer->tm_sec);
fclose(fp);
}
}

int main(void)
{
get_data();
put_data();
return 0;
}

显示文件内容

代码清单13-5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*程序名:list1305.c*/
/*
将标准输入的数据复制到标准输出
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
int ch;
while ((ch = getchar()) != EOF)
putchar(ch);

return 0;
}

9

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
/*程序名:list1306.c*/
/*
显示文件内容
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
int ch;
FILE* fp;
char fname[FILENAME_MAX];

printf("文件名:");
scanf("%s", fname);

if ((fp = fopen(fname, "r")) == NULL)
printf("\a文件打开失败。\n");
else
{
while ((ch = fgetc(fp)) != EOF)
putchar(ch);
fclose(ch);
}

return 0;
}

文件的复制

代码清单13-7

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
/*程序名:list1307.c*/
/*
复制文件
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
int ch;
FILE* sfp;
FILE* dfp;
char sname[FILENAME_MAX];
char dname[FILENAME_MAX];

printf("打开原文件:"); scanf("%s", sname);
printf("打开目标文件:"); scanf("%s", dname);

if ((sfp = fopen(sname, "r")) == NULL)
printf("\a原文件打开失败。\n");
else
{
/*书中写法有问题,想写入数据到文件中,需要以写权限打开文件。*/
if ((dfp = fopen(dname, "w")) == NULL)
printf("\a目标文件打开失败。\n");
else
{
while ((ch = fgetc(sfp)) != EOF)
fputc(ch, dfp);
fclose(dfp);
}
fclose(sfp);
}

return 0;
}

想写入数据到文件中,需要以写权限打开文件,不然目标文件不会被分配缓冲区地址无法将原文件缓冲区数据传输到目的文件缓冲区。

10

注意:使用 fputc 函数之前要先存在流文件位置指示符,即以写权限打开目的文件。

文本和二进制

在文本文件中保存实数

代码清单13-8

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
/*程序名:list1308.c*/
/*
将圆周率的值写入文本文件,再进行读取
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
double pi = 3.14159265358979323846;

printf("从变量pi得到的圆周率为%23.21f。\n", pi);

/*写入操作*/
if ((fp = fopen("PI.txt", "w")) == NULL)
printf("\a文件打开失败。\n");
else
{
fprintf(fp, "%f", pi);
fclose(fp);
}

/*读取操作*/
if ((fp = fopen("PI.txt", "r")) == NULL)
printf("\a文件打开失败。\n");
else
{
fscanf(fp, "%lf", &pi);
printf("从文件读取的圆周率为%23.21f。\n", pi);
fclose(fp);
}

return 0;
}

在二进制文件中保存实数

11

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
/*程序名:list1309.c*/
/*
将圆周率的值写入二进制文件再进行读取
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
double pi = 3.14159265358979323846;

printf("从变量pi得到的圆周率为%23.21f。\n", pi);

/*写入操作*/
if ((fp = fopen("PI.bin", "wb")) == NULL)
printf("\a文件打开失败。\n");
else
{
fwrite(&pi, sizeof(double), 1, fp);
fclose(fp);
}

/*读取操作*/
if ((fp = fopen("PI.bin", "rb")) == NULL)
printf("\a文件打开失败。\n");
else
{
fread(&pi, sizeof(double), 1, fp);
printf("从文件读取的圆周率为%23.21f。\n", pi);
fclose(fp);
}
return 0;
}

显示文件自身

12

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
/*程序名:list1310.c*/
/*
用字符和字符编码显示文件内容
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
int n;
unsigned long count = 0;
unsigned char buf[16];
FILE* fp;
char fname[FILENAME_MAX];

printf("文件名:");
scanf("%s", fname);

if ((fp = fopen(fname, "rb")) == NULL)
printf("\a文件打开失败。\n");
else
{
while ((n = fread(buf, 1, 16, fp)) > 0)
{
int i;

printf("%08lX ", count);

for (i = 0; i < n; i++)
printf("%02X ", (unsigned)buf[i]);

if (n < 16)
{
for (i = n; i < 16; i++)
printf(" ");
}

printf(" ");
for (i = 0; i < n; i++)
putchar(isprint(buf[i]) ? buf[i] : '.');

putchar('\n');

count += 16;
}
fclose(fp);
}
return 0;
}

printf函数与scanf函数

printf函数:带格式输出

13
14
15
16

scanf函数:带格式的输入

17
18
19
20

这一节的内容只做参考,需要用到的再查。

总结

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
/*程序名:summary.c*/
/*
将标准输入的数据写入文件
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
int ch;
FILE* fp;
char fname[FILENAME_MAX];

printf("目标文件名:");
scanf("%s\n", fname);

if ((fp = fopen(fname, "w")) == NULL)
printf("\a无法打开目标文件。\n");
else
{
while ((ch = fgetc(stdin)) != EOF)
fputc(ch, fp);
fclose(fp);
}
return 0;
}

练习

练习13-1

21

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*程序名:lx13-1*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
char filename[128];
printf("请输入要打开文件名为abc的文件:");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp==NULL)
{
printf("该文件不存在");
}
else
{
printf("该文件存在");
fclose(fp);
}
return 0;
}

练习13-2

22

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
/*程序名:lx13-2*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
char filename[128];
printf("请输入要清除内容的文件名:");
scanf("%s", filename);
fp = fopen(filename, "r");
if (fp==NULL)
{
printf("该文件不存在。\n");
}
else
{
fp = fopen(filename, "w");
printf("该文件内容已清除。\n");
fclose(fp);
}
return 0;
}

练习13-3

23

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*程序名:lx13-3.c*/


#define _CRT_SECURE_NO_DEPRECATE
#include <string.h>
#include <stdio.h>

/*---表示学生的结构体---*/
struct Student {
char name[100];
double height;
double weight;
} ;

/*---将x和y指向的学生进行交换---*/
void swap_weight(struct Student* x, struct Student* y)
{
struct Student temp = *x;
*x = *y;
*y = temp;
}

void sort_by_height(struct Student a[], int n)
{
int i, j;
for (i = 0; i < n - 1; i++)
{
for (j = n - 1; j > i; j--)
{
if (a[j - 1].height > a[j].height)
{
swap_weight(&a[j - 1], &a[j]);
}
}
}
}

int main(void)
{
FILE* fp;
int ninzu = 0; /*人数*/
char name[100]; /*姓名*/
struct Student temp[10];
double height, weight; /*身高,体重*/
double hsum = 0.0; /*身高合计*/
double wsum = 0.0; /*体重合计*/


if ((fp = fopen("hw.dat", "r")) == NULL)
printf("\a文件打开失败。\n");
else
{
while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3)
{
//传值
strcpy(temp[ninzu].name,name);
temp[ninzu].height = height;
temp[ninzu].weight = weight;

ninzu++;
hsum += height;
wsum += weight;
}

//按身高排序
sort_by_height(temp, ninzu);

for (int i = 0; i < ninzu; i++)
{
printf("%s %5.1f %5.1f\n", temp[i].name, temp[i].height, temp[i].weight);
}

//输出结果
printf("---------------------------\n");
printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);
fclose(fp);
}
return 0;
}

练习13-4

24

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
/*程序名:lx13-4.c*/


#define _CRT_SECURE_NO_DEPRECATE
#include <math.h>
#include <stdio.h>

int main(void)
{
FILE* fp;
char fn[128];
int ninzu = 0; /*人数*/
char name[100]; /*姓名*/
double height, weight; /*身高,体重*/
double hsum = 0.0; /*身高合计*/
double wsum = 0.0; /*体重合计*/

printf("请输入要打开的文件名:");
scanf("%s", fn);

if ((fp = fopen(fn, "w")) == NULL)
printf("\a文件打开失败。\n");
else
{
printf("请请入要写入学生的数据的条数:");
scanf("%d", &ninzu);

//写入数据到文件
while(ninzu--)
{
printf("请输入学生的姓名、身高、体重:");
scanf("%s%lf%lf", name, &height, &weight);
fprintf(fp, "%s %lf %lf", name, height, weight);
}
fclose(fp); //写文件后要关闭文件才能将数据真正写入到文件中,不然你输入的内容一直在文件的临时缓冲区,并不会写入到文件中。

fp = fopen(fn, "r");
//输出文件内容
printf("\n\n------输出 %s 内容------\n",fn);
while (fscanf(fp, "%s%lf%lf", name, &height, &weight) == 3)
{
printf("%-10s %5.1f %5.1f\n", name, height, weight);
}
fclose(fp);
}
return 0;
}

练习13-5

25

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*程序名:list1304.c*/
/*
显示程序上一次运行的日期和时间
*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

char data_file[] = "datetime.dat";

/*---取得并显示上一次运行时的日期和时间---*/
void get_data(void)
{
FILE* fp;
if ((fp = fopen(data_file, "r")) == NULL)
printf("本程序第一次运行。\n");
else
{
int year, month, day, h, m, s;
char mod[10] = {"无"};
fscanf(fp, "%d%d%d%d%d%d%s", &year, &month, &day, &h, &m, &s, mod);
printf("上一次运行是在%d年%d月%d日%d时%d分%d秒,心情%s!!\n", year, month, day, h, m, s, mod);
fclose(fp);
}
}

/*---写入本次运行时的日期和时间---*/
void put_data(void)
{
FILE* fp;
time_t current = time(NULL);
struct tm* timer = localtime(&current);

//fopen 写文件时,如果文件不存在会创建一个新文件
if ((fp = fopen(data_file, "w")) == NULL)
printf("\a文件打开失败。\n");
else
{
fprintf(fp, "%d %d %d %d %d %d",
timer->tm_year + 1900,
timer->tm_mon + 1,
timer->tm_mday,
timer->tm_hour,
timer->tm_min,
timer->tm_sec);
fclose(fp);
}
}

void mood(void)
{
FILE* fp;
char mod[10] = { 0 };

printf("请输入你今天的心情:");
scanf("%s", mod);

//fopen 写文件时,如果文件不存在会创建一个新文件
if ((fp = fopen(data_file, "a")) == NULL)
printf("\a文件打开失败。\n");
else
{
fprintf(fp, " %s\n",mod);
fclose(fp);
}
}

int main(void)
{
get_data();
put_data();
mood();
return 0;
}

“a” 表示在原文件内容的更新追加内容。”a+” 表示在原文件内容基础上新的内容。

练习13-6

26

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
/*程序名:lx13-6.c*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>


int main(void)
{
FILE* fp;
char data_file[128];
int num = 0;
int ch = 0;
printf("请输入要统计行数的文件名:");
scanf("%s", data_file);

if ((fp = fopen(data_file, "r")) == NULL)
printf("\a文件打开失败。\n");
else
{
while ((ch = fgetc(fp)) != EOF)
{
if (ch == '\n')
{
num++;
}
}
}

printf("文件%s有%d行。", data_file, num);

return 0;
}

练习13-7

27

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
/*程序名:lx13-7.c*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>


int main(void)
{
FILE* fp;
char data_file[128];
int num = 0;
int ch = 0;
printf("请输入要统计行数的文件名:");
scanf("%s", data_file);

if ((fp = fopen(data_file, "r")) == NULL)
printf("\a文件打开失败。\n");
else
{
while ((ch = fgetc(fp)) != EOF)
{
num++;
}
}

printf("文件%s有%d字。", data_file, num);

return 0;
}

练习13-8

28

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
/*程序名:lx13-8.c*/


#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
int ch;
FILE* sfp;
FILE* dfp;
char sname[FILENAME_MAX];
char dname[FILENAME_MAX];

printf("打开原文件:"); scanf("%s", sname);
printf("打开目标文件:"); scanf("%s", dname);

if ((sfp = fopen(sname, "r")) == NULL)
printf("\a原文件打开失败。\n");
else
{
while ((ch = fgetc(sfp)) != EOF)
{
putchar(ch);
}
fclose(sfp);

/*书中写法有问题,想写入数据到文件中,需要以写权限打开文件。*/
if ((dfp = fopen(dname, "w")) == NULL)
printf("\a目标文件打开失败。\n");
else
{
sfp = fopen(sname, "r");
while ((ch = fgetc(sfp)) != EOF)
fputc(ch, dfp);
fclose(dfp);
}
fclose(sfp);
}

return 0;
}

文件句柄只能执行一次相关操作,操作结束后会失效。如果要对文件进行第二次操作,需要先关闭当前的文件句柄再开启一个新的文件句柄。
其次文件句柄失效后是无法修改,或是赋值到另一个变量中进行使用。

练习13-9

29

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
56
/*程序名:lx13-9.c*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int conlow(int x)
{
if (x >= 'a' && x <= 'z')
{
x -= 32;
}
return x;
}

int conupp(int x)
{
if (x >= 'A' && x <= 'Z')
{
x += 32;
}
return x;
}

int main(void)
{
int ch;
FILE* sfp;
FILE* dfp;
int* sfpb; //备份原 sfp->_Placeholder 的指针,即文件缓冲区的初始指针
char sname[FILENAME_MAX];
char dname[FILENAME_MAX];

printf("打开原文件:"); scanf("%s", sname);
printf("打开目标文件:"); scanf("%s", dname);

if ((sfp = fopen(sname, "r")) == NULL)
printf("\a原文件打开失败。\n");
else
{
/*书中写法有问题,想写入数据到文件中,需要以写权限打开文件。*/
if ((dfp = fopen(dname, "w")) == NULL)
printf("\a目标文件打开失败。\n");
else
{
while ((ch = fgetc(sfp)) != EOF)
{
fputc(conlow(ch), dfp);
}
fclose(dfp);
}
fclose(sfp);
}

return 0;
}

练习13-10

30

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
56
/*程序名:lx13-10.c*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int conlow(int x)
{
if (x >= 'a' && x <= 'z')
{
x -= 32;
}
return x;
}

int conupp(int x)
{
if (x >= 'A' && x <= 'Z')
{
x += 32;
}
return x;
}

int main(void)
{
int ch;
FILE* sfp;
FILE* dfp;
int* sfpb; //备份原 sfp->_Placeholder 的指针,即文件缓冲区的初始指针
char sname[FILENAME_MAX];
char dname[FILENAME_MAX];

printf("打开原文件:"); scanf("%s", sname);
printf("打开目标文件:"); scanf("%s", dname);

if ((sfp = fopen(sname, "r")) == NULL)
printf("\a原文件打开失败。\n");
else
{
/*书中写法有问题,想写入数据到文件中,需要以写权限打开文件。*/
if ((dfp = fopen(dname, "w")) == NULL)
printf("\a目标文件打开失败。\n");
else
{
while ((ch = fgetc(sfp)) != EOF)
{
fputc(conupp(ch), dfp);
}
fclose(dfp);
}
fclose(sfp);
}

return 0;
}

练习13-11

31

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
/*程序名:lx13-11.c*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
double number[10] = { 1.123,2.123,3.123,4.123,5.123,6.123,7.123,8.123,9.123,10.123 };
double number1[10] = {0};

FILE* fp;
if ((fp = fopen("number", "wb"))==NULL)
{
printf("文件打开失败。\n");
}
else
{
fwrite(number, sizeof(double), 10, fp);
fclose(fp);
}

if ((fp = fopen("number", "rb")) == NULL)
{
printf("文件打开失败。\n");
}
else
{
fread(number1, sizeof(double), 10, fp);
printf("%lf %lf %lf", number1[0], number1[1], number1[2]);
fclose(fp);
}

return 0;
}

练习13-12

32

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
/*程序名:lx13-12.c*/
#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

char data_file[] = "date.dat";

/*---取得并显示上一次运行时的日期和时间---*/
void get_data(void)
{
FILE* fp;
if ((fp = fopen(data_file, "rb")) == NULL)
printf("本程序第一次运行。\n");
else
{
int data[6];

fread(data,sizeof(int),6,fp);
printf("上一次运行是在%d年%d月%d日%d时%d分%d秒。\n", data[0], data[1], data[2], data[3], data[4], data[5]);
fclose(fp);
}
}

/*---写入本次运行时的日期和时间---*/
void put_data(void)
{
FILE* fp;
time_t current = time(NULL);
struct tm* timer = localtime(&current);
int data[6] = { timer->tm_year + 1900,timer->tm_mon + 1,timer->tm_mday,timer->tm_hour,timer->tm_min, timer->tm_sec };
//fopen 写文件时,如果文件不存在会创建一个新文件
if ((fp = fopen(data_file, "wb")) == NULL)
printf("\a文件打开失败。\n");
else
{
fwrite(data, sizeof(int), 6, fp);
fclose(fp);
}
}

int main(void)
{
get_data();
put_data();
return 0;
}

练习13-13

33

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
/*程序名:lx13-13.c*/

#define _CRT_SECURE_NO_DEPRECATE
#include <time.h>
#include <stdio.h>

int main(void)
{
char ch;
FILE* sfp;
FILE* dfp;
char sname[FILENAME_MAX];
char dname[FILENAME_MAX];

printf("打开原文件:"); scanf("%s", sname);
printf("打开目标文件:"); scanf("%s", dname);

if ((sfp = fopen(sname, "r")) == NULL)
printf("\a原文件打开失败。\n");
else
{
/*书中写法有问题,想写入数据到文件中,需要以写权限打开文件。*/
if ((dfp = fopen(dname, "wb")) == NULL)
printf("\a目标文件打开失败。\n");
else
{
while ((ch = fgetc(sfp)) != EOF)
fwrite(&ch,sizeof(char),1,dfp);
fclose(dfp);
}
fclose(sfp);
}

return 0;
}
  • 本文标题:C语言语法入门-文件处理
  • 本文作者:9unk
  • 创建时间:2023-08-15 23:21:00
  • 本文链接:https://9unkk.github.io/2023/08/15/c-yu-yan-yu-fa-ru-men-wen-jian-chu-li/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!