云计算百科
云计算领域专业知识百科平台

嵌入式第二十四课!!linux应用软件编程与文件操作!!!

在结束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;
}

以上就是今天和大家分享的内容!!!感谢你的阅读!!!如果有疑问和错误欢迎在评论区评论!!!

赞(0)
未经允许不得转载:网硕互联帮助中心 » 嵌入式第二十四课!!linux应用软件编程与文件操作!!!
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!