文件编程:
用户角度:

流,stream;

编程角度:
-
打开文件。
-
读/写。(判断)
3,关闭。
Linux系统的结构

Linux系统对于文件? 设计
思想:
一切皆文件!file'



函数 打开:
man手册的使用

名字-摘要-描述-返回值;


函数 删除:
返回值:
FILE * //流指针 文件指针 代表打开了的某个文件
成功 FILE * 流指针
失败 NULL & errno 会被设置
void perror(const char *s);
功能:
可以根据errno打印对应的错误信息
打印效果:
perror("自定义的信息");
自定义信息:错误原因
会指出错误的原因:

示例:
bash
#include<stdio.h>
int main()
{
FILE*fp = fopen ("txt.c","r");
//
打开的方式:
r 只读
r+ 读和写
w 文件存在截断成0,不存在创建一个新的文件。
w+ 读写
a 在文件末尾出写
注意 文件存在在末尾追加的写,不存在则创建
a+ 读写
if(NULL == fp)
{/*
printf("error\n");
*/
perror("fopen fail");
return 1;
}
printf("success\n");
return 0;
}
关闭 文件:

实际上是个宏 相当于-1;
bash
#include <stdio.h>
// 处理命令行参数 ./a.out txt.c 2个参数
int main(int argc, const char* argv[])
{
if (argc != 2)
{
printf("Usage : %s <filename>\n", argv[0]);
return -1;
}
// open the file
FILE* fp = fopen("txt.c", "w");
if (NULL == fp)
{ /*
printf("error\n");
*/
perror("fopen fail");
return 1;
}
printf("success\n");
fclose(fp); // 函数
return 0;
}



标准输入:
bash
#include <stdio.h>
int main(int argc, char **argv)
{
int ret = fgetc(stdin); // 从键盘上面输入
printf("ret = %c:%d\n", ret, ret);
// 连续输出
int ret =0;
while((ret = fgetc(stdin)) != EOF) // 返回值是int类型;
{
printf("ret = %c:%d\n", ret, ret);
}
// 运行后ctrl + d 结束
return 0;
}
运行结果
a
ret = a:97
ret = //包含回车
:10
c
ret = c:99
ret =
:10
d
ret = d:100
ret =
:10
cat 显示函数练习:
bash
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage : %s <filename>\n", argv[0]); 给出用户解释输入方式
return -1;
}
打开 fopen
读写 printf
关闭
FILE *fp = fopen(argv[1], "r"); // 读./a.out (file) // 打开文件
int ret = 0;
while ((ret = fgetc(fp)) != EOF) // 利用指针读取文件
{
printf("%c", ret);
}
fclose(fp);
return 0;
}
标准输出:
bash
int ret = 0;
while ((ret = fgetc(stdin)) != EOF)
{
// printf("%c", ret);
fputc(ret, stdout); 代替printf
}
return 0;
}
练习;cp shuru.c txt2.c 复制源文件到目标文件中。
bash
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc != 3)
{
printf("Usage : %s <filename> <filename>\n", argv[0]);
return -1;
}
FILE *fp_s = fopen(argv[1], "r"); // 代表打开文件
FILE *fp_d = fopen(argv[2], "w");
if(fp_s == NULL || fp_d == NULL)
{
perror("fail name");
return -1;
}
int ret = 0;
int ret1 = 0;
while ((ret = fgetc(fp_s)) != EOF)
{
fputc(ret, fp_d); // 输出过程是把读取的ret 写入fp_d 中。
}
fclose(fp_s);
fclose(fp_d);
return 0;
}
diff 1.c 2.c 判断是否一样
vi 1.c 2.c -d




bash
#include <stdio.h>
int main(int argc, char **argv)
{
char a[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
fgets(a, sizeof(a), stdin);
for (int i = 0; i < 10; i++)
{
printf("a[%d] = %c : %d\n", i, a[i], a[i]);
}
return 0;
}
输入hello后的 输出结果
hello
a[0] = h : 104
a[1] = e : 101
a[2] = l : 108
a[3] = l : 108
a[4] = o : 111 // 包含回车的输入
a[5] =
: 10
a[6] = : 0 // '\0'结尾
a[7] = : 1
a[8] = : 1
a[9] = : 1
读取终止条件的判断:

char *fgets(char *s, int size, FILE *stream);
字符串读取。
练习 用 fgets 实现 cat (显示代码)功能:
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage : %s <filename>\n", argv[0]);
return -1;
}
FILE *fp = fopen(argv[1], "r"); //打开文件和以什么方式
char a[5] = {0}; // 用字符串,每次最多读取4个字符
char *ret = NULL; // 用于接收fgets的返回值
while (1)
{
if ((ret = fgets(a, sizeof(a), fp)) == NULL) //读取文件,判断返回值是否为空
{
break;
}
printf("%s", a); // 不断输出字符串
}
fclose(fp); //关闭文件
return 0;
}