一、系统编程(大量的函数)属于应用程序编程,系统编程是操作系统走完程序后,才运行我的程序;
底层编程中包含驱动
二、Linux系统编程包括:
文件:
进程:同一时刻,多个任务同时进行
网络:
数据库
三、标准io(io是输入输出 stdio.h)
从内存里出来叫输出,从键盘进去叫输入
<> 是系统库函数,默认路径: /user/include
eg:---> stdio.h ---> stdio.c ---> libc.so --> /usr/ lib so动态库(lib.c so 此时是一个二进制文件,也叫库文件)
" "是用户自定义函数,默认是当前路径
/etc 是掌管linux所有配置的文件路径
四、标准io
1.文件:文件操作的步骤:打开 --> 读写 --> 关闭
2.读写文件时,往后读,系统会自动++,称为文件流指针
3.读写相关操作: fgec/fputc 一次处理一个字符。
4.fgets/fputs 一次处理一行,用来处理文本文件
5.fread/fwrite 用于处理二进制文件(如 ./a.out)
6.r / r+ 目标文件必须存在,否则会打开失败
7.w 目标文件存在清空 或 创建一个可写的文件
8.w+ 目标文件可以不存在。不存在:创建;存在:清空。
9.fgetc ·EOF //文件读完,end of file 宏值为-1
10.vimdiff 1.txt
11.fgets/fputs s代表字符串的意思,文本文件
12.(1)char *fgets (char *s, int size, FILE *stream), size表示最多读几个。 遇到\n就终止了,因为一次读一行。读到的东西个数:size - 1个,字符串最后一个是' \0 '。读完返回null(文件到达结尾或出错,一般当作到达结尾),文本文件开空间时,大小建议开1~4K。
(2)fputs 后面要手动加换行
五、练习
1.fputc函数
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp = fopen("1.txt", "w");
if(NULL == fp)
{
fprintf(stderr, "fopen");
return 1;
}
fputc('M', fp);
fputc('e', fp);
fputc('i', fp);
fputc('Z', fp);
fputc('u', fp);
fputc('o', fp);
fputc('\n', fp);
fclose(fp);
return 0;
}
2.fgetc函数
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp = fopen("1.txt", "r");
if(NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
while(1)
{
int c = fgetc(fp);
if(EOF == c)
{
break;
}
printf("%c", c);
}
printf("\n");
fclose(fp);
return 0;
}
3.cp(fgetc和fputc)
#include <stdio.h>
int main(int argc, char **argv)
{
if(argc < 2)
{
fprintf(stderr, "usage: ./a.out srcfile destfile\n");
return 1;
}
FILE *src = fopen(argv[1], "r");
FILE *dest = fopen(argv[2], "w");
if(NULL == src || NULL == dest)
{
fprintf(stderr, "fopen error\n");
return 1;
}
int count = 0;
while(1)
{
int c = fgetc(src);
if(EOF == c)
{
break;
}
fputc(c, dest);
count++;
}
fclose(src);
fclose(dest);
printf("%d\n",count);
return 0;
}
4.fgets
#include <stdio.h>
int main(int argc, char **argv)
{
if(argc < 2)
{
fprintf(stderr, "usage: ./a.out srcfile destfile\n");
return 1;
}
FILE *fp = fopen(argv[1], "r");
if(NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
char buf[1024] = {0};
int count = 0;
while(1)
{
if(NULL == fgets(buf, sizeof(buf), fp))
{
break;
}
count++;
printf("%s", buf);
}
fclose(fp);
printf("行数有:%d行\n", count);
return 0;
}
5.fputs
#include <stdio.h>
int main(int argc, char **argv)
{
FILE *fp = fopen("1.txt", "w");
if(NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
char buf[] = "cyy ";
char buf2[] = "and xiaofan";
fputs("hello ", fp);
fputs("\n", fp);
fputs(buf, fp);
fputs("\n", fp);
fputs(buf2, fp);
fputs("\n", fp);
fclose(fp);
return 0;
}
6.cp2.0(fgets和fputs)
#include <stdio.h>
int main(int argc, char **argv)
{
if(argc < 2)
{
fprintf(stderr, "usage: ./a.out srcfile destfile\n");
return 1;
}
FILE *src = fopen(argv[1], "r");
FILE *dest = fopen(argv[2], "w");
if(NULL == dest || NULL == src)
{
fprintf(stderr, "fopen error\n");
return 1;
}
char buf[1024] = {0};
while(1)
{
char *s = fgets(buf, sizeof(buf), src);
if(NULL == s)
{
break;
}
fputs(s, dest);
}
fclose(dest);
fclose(src);
return 0;
}
7.统计文本文件中a-z,出现的次数。并输出。/etc/passwd
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "usage is ./a.out file1 \n");
return 1;
}
FILE *fp = fopen(argv[1], "r");
if (NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
int count = 0;
char buf[1024] = {0};
if (NULL == fgets(buf, sizeof(buf), fp))
{
return 1;
}
else
{
int i;
char s[100] = {0};
for (i = 0; i < 26; ++i)
{
s[i] = i + 97;
}
int a[100] = {0};
while(1)
{
int c = fgetc(fp);
if(EOF == c)
{
break;
}
else
{
for(i = 0; i < 26; ++i)
{
if(s[i] == c)
{
a[i] += 1;
}
}
}
}
fclose(fp);
for(i = 0; i < 26; ++i)
{
printf("%c = %d\n",s[i], a[i]);
}
}
return 0;
}