在结束C语言与数据结构的学习后,我们从本节课开始学习linux应用软件编程:
linux应用软件编程
它分为以下几个板块:
1. 文件操作——一切皆基于文件的基础上操作
2. 多任务——多进程、多线程工作
3. 网络编程
4. 构建网络服务器
5. 数据库
linux应用软件编程实际上就是操作系统相关的编程,也就是使用不同的函数接口、搭建不同的流程框架;
文件操作
Linux下的文件类型
linux下的文件类型共有七种:
b 块设备文件 ——> 存储类设备(硬盘)
c 字符设备文件 ——>如输入输出设备(鼠标、键盘、显示器…)
d 目录文件 ——>文件夹
– 普通文件 ——>xxx.c xxx.h xxx.txt xxx.jpg xxx.mp4 a.out
l 软链接文件 ——>快捷方式(windows)
s 套接字文件 ——>网络通信
p 管道文件 ——>进程间通信
举个例子:(在终端使用命令ls -l可以查看当前目录文件的详细信息)
1.最前面的 “ d ”就是代表了文件类型;
2.“ d ”后的“rwxrwxrwx”代表了文件的操作权限:
r:read
w:write
x:可执行权限
-:无权限
第一段的“rwx”代表自己对文件的读写执行权限;
第二段的“rwx”代表同组用户对文件的读写执行权限;
第三段的“rwx”代表其他人对文件的读写执行权限;
3.数字“4”代表链接个数;
4.后面的第一个“linux”是用户自己的名字,第二个是组名;
5.4096代表该文件的字节大小;
6.时间(Mar 19 2020)代表该文件最后被修改的时间;
7.最后的“vim”是该文件的文件名;
文件操作的思想
我们围绕文件进行操作主要是这三步:
1. 打开文件
2. 读写文件
3. 关闭文件
文件操作的方法
在Linux下有这2种文件操作方法(I:input ; O:output):
1. 标准IO:
是C标准库提供的一套对文件操作的操作方法,即库函数;
2. 文件IO:
Linux内核提供的一套对文件操作的操作方法,即在系统调用;
标准IO
在库文件里要调用的对文件操作的函数如下:
1. 打开文件 fopen
2. 读/写文件
fgetc/fputc :一个字符一个字符的读写数据
fgets/fputs: 一行一行的读写数据
fread/fwrite:
3 . 关闭文件 fclose
在调用函数的时候,我们可以通过man+函数来查找函数的使用方式:
1.打开文件 fopen
fopen函数是在这样使用的:
FILE *fopen(const char *pathname, const char *mode);
功能:打开一个文件并获得一个文件流指针
参数:
pathname:打开得文件的文件名地址
mode:打开的方式
"r" 以只读的方式打开, 文件必须存在
"r+" 以读写的方式打开,文件必须存在
"w" 以只写的方式打开,文件存在则清空,文件不存在则创建
"w+" 以读写的方式打开,文件存在则清空,文件不存在则创建
"a" 以追加写的方式打开,文件不存在创建
"a+" 以读写的方式打开,文件不存在创建,,文件存在追加写
返回值:
打开成功:文件流指针:FILE *
打开失败:NULL
在文件操作里,流指的就是字节流;而文件流,就是数据从文件流入流出,体现出来的字节流;在标准IO里,FILE 就是文件流,FILE * 就是文件流指针,指向已打开文件;
2.关闭文件fclose
fclose函数是这样使用的:
int fclose (FILE *stream)
它用来关闭文件;
举个例子:
include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt", "a");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
printf("fopen file ok\\n");
fclose(fp);
return 0;
}
3.为文件写入字符fputc
fputc是这样使用的:
int fputc(int c, FILE *stream);
功能:向文件中写入一个字符
参数:
c:要写入的字符
stream:要写入的文件的文件流指针
返回值:
成功:写入的字符的ASCII值
失败:EOF (-1)
我们在终端运行时,可以使用命令od – c +文件名,可以以字符形式在终端输出文件内容;
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt", "w+");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
printf("fopen file ok\\n");
fputc('a', fp);
fputc(97, fp);
fputc(98, fp);
fputc(ch1, fp);
fclose(fp);
return 0;
}
而且,我们可以通过循环,输入字符串:
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt", "w+");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
printf("fopen file ok\\n");
char str[32] = {"hello world"};
char *pstr = "hello world";
for (int i = 0; i < strlen(pstr); ++i)
{
fputc(str[i], fp);
}
fclose(fp);
return 0;
}
4.从文件读出字符fgetc
fgetc是这样使用的:
int fgetc(FILE *stream);
功能:从文件中读取一个字符
参数:
stream:要读取的文件的文件流指针
返回值:
成功:读到的字符的ASCII值
失败:EOF
读到文件末尾:EOF
举个例子:
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./01_fopen.c", "r");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
while (1)
{
int ret = fgetc(fp);
if (EOF == ret)
{
//printf("end of file or error\\n");
break;
}
printf("%c", ret);
}
fclose(fp);
return 0;
}
5.使用fgetc和fputc进行应用
使用fgetc实现cat函数(输出该文件的所有内容)的功能
#include<stdio.h>
int main(void)
{
FILE *fs = fopen("./2.txt ", "r");
if(fs == NULL)
{
printf("open error\\n");
return 0;
}
else
{
printf("open file\\n");
}
int ret = fgetc(fs);
while(EOF != ret)
{
printf("%c",ret);
ret = fgetc(fs);
}
fclose(fs);
return 0;
}
使用fgetc和fputc来实现文件的拷贝功能
#include<stdio.h>
#include<string.h>
int main(int argc , const char* argv[])
{
printf("Usage : ./a.out <stc> <des>");
if (argc != 3)
{
printf("error");
return 0;
}
FILE *fp = fopen(argv[1],"r");
FILE *fs = fopen(argv[2], "w");
if(fp == NULL)
{
printf("open error\\n");
return 0;
}
else
{
printf("open file\\n");
}
if(fs == NULL)
{
printf("open error\\n");
return 0;
}
else
{
printf("open file\\n");
}
int ret = fgetc(fp);
while(EOF != ret)
{
fputc(ret,fs);
ret = fgetc(fp);
}
fclose(fp);
fclose(fs);
return 0;
}
6.用主函数传参来实现不同文件的拷贝
通过主函数进行传参,在编译后,执行文件+参数;
./a.out aaa bbb ——>实参
主函数中的参数 ——>形参
./a.out aaa bbb
argc : 程序运行时,给主函数传递的参数个数 3
argv : 指针数组:一共有argc个指针,分别指向了给主函数传递的实参
argv[0] —->"./a.out"
argv[1] —->"aaa"
argc[2] —->"bbb"
int main(int argc, const char *argv[])
{
if (argc != 3)
{
printf("Usage : ./a.out <srcfile> <dstfile>\\n");
return -1;
}
FILE *srcfp = fopen(argv[1], "r");
FILE *dstfp = fopen(argv[2], "w");
if (NULL == srcfp || NULL == dstfp)
{
printf("fopen error\\n");
return -1;
}
while (1)
{
int ret = fgetc(srcfp);
if (EOF == ret)
{
break;
}
fputc(ret, dstfp);
}
fclose(srcfp);
fclose(dstfp);
return 0;
}
7.为文件写入字符串fputs
fputs是这样使用的:
int fputs(const char *s, FILE *stream);
功能:向文件中写入字符串(不会写入'\\0'字符)
参数:
s:字符串首地址
stream:要写入的文件流指针
返回值:
成功:非负的整形数据
失败:EOF(-1)
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("1.txt", "w");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
fputs("hello world", fp);
char str[32] = {"how are you"};
fputs(str, fp);
char *pstr = "hello world";
fputs(pstr, fp);
fclose(fp);
return 0;
}
8.文件读出字符串fgets
fgets函数是这样使用的:
char *fgets(char *s, int size, FILE *stream);
功能: 从文件中读取一行数据
参数:
s : 用来存放读取到数据的内存空间首地址
size:希望从文件中读到的字节数
stream:要读取的文件流指针
返回值:
成功:返回s空间的首地址
失败:NULL
读到文件末尾:NULL
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("1.txt", "r");
if (NULL == fp)
{
printf("fopen error\\n");
return -1;
}
char s[100] = {0};
char *p = fgets(s, sizeof(s), fp);
if (NULL == p)
{
printf("error or end of file\\n");
}
printf("s = %s\\n", s);
fclose(fp);
return 0;
}
以上就是今天和大家分享的内容!!!感谢你的阅读!!!如果有疑问和错误欢迎在评论区评论!!!
评论前必须登录!
注册