day14: 文件读写操作
This commit is contained in:
parent
5408f0b622
commit
048a4d83ac
|
@ -19,3 +19,5 @@
|
||||||
#### day12: 字符串处理函数,const,结构体
|
#### day12: 字符串处理函数,const,结构体
|
||||||
|
|
||||||
#### day13: 结构体,位域,共用体,枚举,链表操作
|
#### day13: 结构体,位域,共用体,枚举,链表操作
|
||||||
|
|
||||||
|
#### day14: 文件读写操作
|
||||||
|
|
BIN
day14/a.out
BIN
day14/a.out
Binary file not shown.
|
@ -0,0 +1,36 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
// 实现读取 filepath 文件的前 top_n 行数据
|
||||||
|
void *read_top_line(const char *filepath, int top_n)
|
||||||
|
{
|
||||||
|
FILE *f = fopen(filepath, "r");
|
||||||
|
if (NULL == f)
|
||||||
|
{
|
||||||
|
perror("fopen");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char(*lines)[100] = calloc(top_n, 100);
|
||||||
|
for (int i = 0; i < top_n; i++)
|
||||||
|
{
|
||||||
|
char *flag = fgets(lines[i], 100, f);
|
||||||
|
if (flag == NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int n = 5;
|
||||||
|
char(*p)[100] = read_top_line("d10.txt", n);
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
printf("第 %d 行: %s", i + 1, *(p + i));
|
||||||
|
}
|
||||||
|
free(p);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
hello,world
|
||||||
|
张三
|
||||||
|
爱唱歌
|
||||||
|
lihai
|
||||||
|
hahaha
|
||||||
|
手机
|
|
@ -0,0 +1,22 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// 文件复制
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *aF = fopen("d11.txt", "r");
|
||||||
|
if (NULL == aF)
|
||||||
|
{
|
||||||
|
perror("fopen");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *bF = fopen("d11_cpy.txt", "w");
|
||||||
|
int c;
|
||||||
|
while ((c = fgetc(aF)) != EOF)
|
||||||
|
{
|
||||||
|
fputc(c, bF);
|
||||||
|
}
|
||||||
|
fclose(aF);
|
||||||
|
fclose(bF);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
hello,world
|
||||||
|
张三
|
||||||
|
爱唱歌
|
||||||
|
lihai
|
||||||
|
hahaha
|
||||||
|
手机
|
|
@ -0,0 +1,6 @@
|
||||||
|
hello,world
|
||||||
|
张三
|
||||||
|
爱唱歌
|
||||||
|
lihai
|
||||||
|
hahaha
|
||||||
|
手机
|
|
@ -0,0 +1,22 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
// 二进制文件复制
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *aF = fopen("d12.jpg", "rb");
|
||||||
|
if (NULL == aF)
|
||||||
|
{
|
||||||
|
perror("fopen");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *bF = fopen("d12_cpy.jpg", "wb");
|
||||||
|
int c;
|
||||||
|
while ((c = fgetc(aF)) != EOF)
|
||||||
|
{
|
||||||
|
fputc(c, bF);
|
||||||
|
}
|
||||||
|
fclose(aF);
|
||||||
|
fclose(bF);
|
||||||
|
return 0;
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 96 KiB |
Binary file not shown.
After Width: | Height: | Size: 96 KiB |
|
@ -0,0 +1,36 @@
|
||||||
|
// 自定义二进制文件写入
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int sid;
|
||||||
|
char name[32];
|
||||||
|
int age;
|
||||||
|
char sex[4];
|
||||||
|
} STU;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
STU s1 = {1, "disen", 20, "男"};
|
||||||
|
STU s2 = {2, "jack", 18, "女"};
|
||||||
|
STU *s3 = malloc(sizeof(STU));
|
||||||
|
s3->sid = 3;
|
||||||
|
strcpy(s3->name, "lily");
|
||||||
|
s3->age = 19;
|
||||||
|
strcpy(s3->sex, "女");
|
||||||
|
|
||||||
|
FILE *f = fopen("d13.txt", "wb");
|
||||||
|
if (NULL == f)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fwrite(&s1, sizeof(STU), 1, f);
|
||||||
|
fwrite(&s2, sizeof(STU), 1, f);
|
||||||
|
fwrite(&s3, sizeof(STU), 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,28 @@
|
||||||
|
// 自定义二进制文件读取
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int sid;
|
||||||
|
char name[32];
|
||||||
|
int age;
|
||||||
|
char sex[4];
|
||||||
|
} STU;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *f = fopen("d13.txt", "rb");
|
||||||
|
if (NULL == f)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
STU *s = malloc(sizeof(STU));
|
||||||
|
fread(s, sizeof(STU), 1, f);
|
||||||
|
printf("%d %s %d %s\n", s->sid, s->name, s->age, s->sex);
|
||||||
|
free(s);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
// 自定义二进制文件读取
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int sid;
|
||||||
|
char name[32];
|
||||||
|
int age;
|
||||||
|
char sex[4];
|
||||||
|
} STU;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *f = fopen("d13.txt", "rb");
|
||||||
|
if (NULL == f)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 让光标移动到文件尾部
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
long file_size = ftell(f); // 获取文件大小
|
||||||
|
printf("文件大小: %ld B\n", file_size);
|
||||||
|
int stu_num = file_size / sizeof(STU);
|
||||||
|
printf("学生数目: %d 位\n", stu_num);
|
||||||
|
|
||||||
|
fseek(f, 0, SEEK_SET); // 重置光标位置到头
|
||||||
|
for (int i = 0; i < stu_num; i++)
|
||||||
|
{
|
||||||
|
STU *s = calloc(1, sizeof(STU));
|
||||||
|
|
||||||
|
int fx = fread(s, sizeof(STU), 1, f);
|
||||||
|
if (fx != 0)
|
||||||
|
printf("%d %s %d %s\n", s->sid, s->name, s->age, s->sex);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
// 行缓冲区
|
||||||
|
// 写数据时遇到换行符,则刷新缓冲
|
||||||
|
// 如果行缓冲不刷新时,则不会输出结果。
|
||||||
|
// 因为输出的内容没有遇到换行符(Linux `\n`), Window(`\r\n`)。
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
printf("Hello World"); // 缓冲区未写满,不会刷新缓冲区,不会输出
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
|
||||||
|
return 0; // 缓冲未写满,不会刷新缓冲区,不会退出程序
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
// 缓冲区一般为 4KB,这里写入 32B,不会刷新缓冲区
|
||||||
|
char m[33] = "disenjackydisenjackydisenjackyab";
|
||||||
|
|
||||||
|
printf("%s", m);
|
||||||
|
fflush(stdout); // 刷新缓冲区,目的是为了让缓冲区中的数据输出到屏幕上
|
||||||
|
while (1)
|
||||||
|
; // 用来观察程序退出时是否会刷新缓冲区,阻塞程序
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
// 程序正常退出也会刷新缓冲区,显示输出
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
// 缓冲区一般为 4KB,这里写入 32B,不会刷新缓冲区
|
||||||
|
char m[33] = "disenjackydisenjackydisenjackyab";
|
||||||
|
|
||||||
|
printf("%s", m);
|
||||||
|
;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
// 读写文本文件
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char *f = (char *)malloc(100);
|
||||||
|
FILE *fp = fopen("d5.txt", "w");
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
perror("fopen");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
fputs("disen", fp);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
disen
|
|
@ -0,0 +1,13 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *f = fopen("d6.txt", "a");
|
||||||
|
// char content[20] = "hello disen";
|
||||||
|
char *m = "小李";
|
||||||
|
int n = fputs(m, f); // 单字符写入
|
||||||
|
printf("已追加内容的结构 n = %d\n", n);
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
hello disen
|
|
@ -0,0 +1,16 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *f = fopen("d7.txt", "r");
|
||||||
|
char line[100] = "";
|
||||||
|
|
||||||
|
while (fgets(line, 100, f) != NULL)
|
||||||
|
{
|
||||||
|
printf("%s", line);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
hello,world
|
||||||
|
张三
|
||||||
|
爱唱歌
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *f = fopen("d8.txt", "r");
|
||||||
|
fseek(f, 3, SEEK_SET); // SEEK_SET 0
|
||||||
|
char m[7];
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
m[i] = (char)fgetc(f);
|
||||||
|
}
|
||||||
|
m[6] = '\0';
|
||||||
|
printf("%s\n", m);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
hello,world
|
||||||
|
张三
|
||||||
|
爱唱歌
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *f = fopen("d9.txt", "r");
|
||||||
|
|
||||||
|
int line1_n = 0;
|
||||||
|
while (fgetc(f) != '\n')
|
||||||
|
line1_n++;
|
||||||
|
|
||||||
|
fseek(f, line1_n + 1, SEEK_SET);
|
||||||
|
|
||||||
|
char line2[100];
|
||||||
|
fgets(line2, 100, f);
|
||||||
|
line2[strlen(line2) - 1] = '\0'; // 去掉换行符
|
||||||
|
printf("line2: %s", line2);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
hello,world
|
||||||
|
张三
|
||||||
|
爱唱歌
|
Loading…
Reference in New Issue