Linux系统编程 --- day1

目录

1. 标准IO

2. 基本操作

2.1 fopen

2.2 fgetc

2.3 fputc

2.4 fgtes

2.5 fputs

2.6 fread

2.7 fwrite

3. linux的文件


1. 标准IO

(1)标准io的概念 1975 Dennis r IO库,C语言的标准,
IO --- input  output
I: 键盘是标准输入设备 = > 默认输入就是指键盘  /dev/input
O: 显示器是标准输出设备 => 默认输出就是指显示器
Linux操作系统当中IO都是对文件的操作
任何支持标准C的系统都可使用标准IO实现文件存储
标准IO在UNIX上是对文件IO的封装
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。

(2)文件的概念:linux中一切都是文件。

         作用:文件用来存储数据(数据,指令);

(3)<> 和 " " 的路径

< > :是系统库函数,默认路径在 /usr/include/

" "  : 是用户自定义函数,默认当前路径。

(4)man 的使用

man  man  => 所有man的帮助 
man  xxx => man 1 xxx => 查看当前xxx命令
man 2 xxx  => 查看xxx对应的系统调用函数
man 3 xxx  => 查看xxx对应的标准库函数

注意:如果没有命令则直接man xxx 会显示其函数,如果没有系统调用则显示系统库函数帮助

(5)文件内容的分类

文本文件和二进制文件。

(6)流(FILE *)

数据从文件当中流入和流出所体现出来的字节流叫做流。

流可分为:二进制流、二进制数据的流、文本流。

2. 基本操作

step1 : 打开文件FILE ---- fopen

step2 : io 操作,读写操作

fgetc / fputc  ---- 一个字符

fgets / fputs  ---- 一次一行

fread / fwrite ---- 自定义大小,操作二进制文件

step3 : 关闭文件  ---- fclose

2.1 fopen

功能:打开一个文件,并建立一个流

语法:FILE *fopen(const char *path, const char *mode);

path:要打开文件的路径

mode:
r  --- 只读(文件不存在报错,文件存在则只读打开)

r+  --- 读写(文件不存在报错,文件存在则读写打开)

w  --- 只写(文件不存在则创建,文件存在则清0只写打开)

w+  --- 写读(文件不存在则创建,文件存在则清0写读打开)

a  --- 追加可写(文件不存在则创建,文件存在则追加只写打开     定位到文件最后增加内容。

a+   --- 追加读写(文件不存在则创建,文件存在则追加读写打开

返回值:成功返回建立的文件流指针,失败返回NULL

2.2 fgetc

功能:从流中读取一个字符

#include <stdio.h>

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","r");          // 打开 1.txt 文件,r 代表只读
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    while(1)
    {
        int c = fgetc(fp);                  // 将读到的字符存到 c
        if(EOF == c)                        // 判断结束
        {
            break;
        }
        printf("%c\n",c);
    }
    fclose(fp);                            // 关闭文件
    return 0;
}

2.3 fputc


int fputc(int c, FILE *stream);
功能:向流中写入一个字符
c   --- 要写入的字符
stream ---- 文件流指针
返回值:成功返回写入的字符ASCII码值,失败返回EOF

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE * fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    int ret = fputc('h',fp);
    if(-1 == ret)
    {
        printf("fputc error\n");
        return 1;
    }
    fputc('e',fp);
    fputc('l',fp);
    fputc('l',fp);
    fputc('o',fp);

    fclose(fp);
    return 0;
}

fgetc 与 fputc 的复制:

#include <stdio.h>

int main(int argc, char *argv[])
{

    if(argc < 3)                            // 需要输入至少3个命令--- ./a.out 1 2
    {
        printf("usage:./a.out srcfile dstfile\n");
        return 1;
    }
    FILE *src = fopen(argv[1],"r");
    FILE * dst= fopen(argv[2],"w");
    if(NULL == src || NULL == dst )
    {
        printf("fopen error\n");
        return 1;
    }
    while(1)
    {
        int c = fgetc(src);
        if(EOF== c)
        {
            break;
        }
        fputc(c,dst);
    }

    fclose(dst);
    fclose(src);
    return 0;
}

2.4 fgtes

功能:从流中读取一个字符串

#include <stdio.h>
int main(int argc, char *argv[])
{

    FILE * fp = fopen("/etc/passwd","r");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    char buf[1024]={0};// 1k-4k
    while(1)
    {
        char* s = fgets(buf,sizeof(buf),fp);
        if(NULL == s)
        {
            break;
        }
        printf("%s\n",buf);
    }
    fclose(fp);
    return 0;
}

2.5 fputs

功能:向流中写入一个字符串

#include <stdio.h>

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    char data[]="hello,world";
    int ret = fputs(data,fp);
    if(EOF == ret)
    {
        printf("fputs error\n");
        return 1;
    }
    fclose(fp);
    return 0;
}

fgets 与 fputs 的复制:

#include <stdio.h>

int main(int argc, char *argv[])
{

    if(argc<3)
    {
        printf("usage:./a.out srcfile dstfile\n");
        return 1;
    }
    FILE * src_fp = fopen(argv[1],"r");
    FILE * dst_fp = fopen(argv[2],"w");
    if(NULL == src_fp ||NULL == dst_fp)
    {
        printf("fopen error\n");
        return 1;
    }
    char buf[1024]={0};                          
    while(1)
    {
        char* s = fgets(buf,sizeof(buf),src_fp);
        if(NULL == s)
        {
            break;
        }
   
        fputs(buf,dst_fp);
    }
    fclose(dst_fp);
    fclose(src_fp);
    return 0;
}

2.6 fread

size_t  fread(void  *ptr,  size_t size, size_t nmemb, FILE *stream);
功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr所在的本地内存中。
参数:ptr 要存储数据的本地内存一般是数组或者结构体指针
          size 单个数据块的元数据大小。最小单元的大小
          nmemb 要获取的数据块的个数,拷贝的数据块个数。
          stream 要获取数据的源文件流对象,如果是stdin表示从键盘获取数据,如果是fp文件则表示从普通文件获取。
        返回值:成功 小于等于nemeb的整数,表示获取的数据长度,失败 小于0,结尾 0;

#include <stdio.h>
#include <string.h>
typedef struct 
{
    char name[50];
    int age;
    char phone[15];
}PER;

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","r");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    PER per;
   // memset(&per,0,sizeof(per));
    bzero(&per,sizeof(per));
    size_t ret= fread(&per,sizeof(per),1,fp);
    printf("name:%s age:%d phone:%s\n",per.name,per.age,per.phone);
    if(ret!=1)
    {
        printf("fread error\n");
        return 1;
    }
    fclose(fp);
    return 0;
}

2.7 fwrite

size_t fwrite(const void  *ptr,  size_t  size,size_t nmemb, FILE *stream);
功能:从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应的文件流对象中。
参数:ptr 要写的数据块地址,一般是数组或者结构体指针
          size  要写的数据块元数据大小,单位是字节
          nmemb 要写的数据块的个数
          stream 要写的目标文件流对象。如果是stdout则表示数据会写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。
        返回值:成功 小于等于nmemb 的个数,失败 <0

#include <stdio.h>
#include <string.h>
typedef struct 
{
    char name[50];
    int age;
    char phone[15];
}PER;

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    PER per;
    strcpy(per.name ,"zhangsan");
    per.age = 20;
    strcpy(per.phone,"111222333");
    size_t ret = fwrite(&per,sizeof(per),1,fp);
    if(ret!=1)
    {
        printf("fwrite error\n");
        return 1;
    }
    fclose(fp);
    return 0;
}

3. linux的文件

(1)文件类型:有七种文件类型

d   --- 目录文件

c   --- 字符设备

b   --- 块设备

l   --- 软链接

p  --- 管道文件

s   --- 套接字

-   --- 普通文件

(2)权限  

r   --- 只读

w  --- 写

x  --- 执行

用户  组用户 其他人

chmod 改权限-

chmod 214 1.txt --- 将1.txt文件的权限改为  -w- --x r--

                                                                    (010 001 100)

注:复制其他文件夹,目标文件夹未写明路径,目标文件默认与a.out在同一路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值