c++笔记1

--------------------------------------------------------------------------
第一天: 文件系统
--------------------------------------------------------------------------
  1. UNIX
环境下的环境变量:
   1.
env 命令
:
   2.
在程序中查看环境变量
, int main(int argc,char* argv[],char* env[])
           int argc      //
命令行上字符串的个数

           char* argv[], //
分别指向命令行上的各个字符串
           char* env[]  //
每个指针指向一个环境变量的字符串;  (不计算有几个字符串, 但是在UNIX环境下有处理的方法: 在最后一个的后面写一个指针,NULL为结束条件)
------------------------------------------------------------------------------
srtncmp(env[i],"
比较的字符",要比几个字符(int ))   //比较两个字符串的前N个字符
:
getenv(const char* name)   //
取得指定的环境变量.返回指向内容的指针
:
-------------------------------------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc,char* argv[],char* env[])
{
for(int i=0;env[i]!=null;i++){     //
直到为NULL结束
;
if(srtncmp(env[i],"PATH=",5)==0)  //
查找指定的环境变量
:
cout<<env[i]<<endl;
}
}
------------------------------------------------------------------------------
#include <iostream>
#include <stdlib.h>    //
最好加上
.
using namespace std;
int main(int argc,char* argv[],char* env[])
{
   char* p=getenv("PATH");  //
   //
如果一个函数的返回类型是指针则其返回类型是NULL; 如果不存在返回
NULL;
if(p==NULL)
cout<<"not found PATH"<<endl;
else
court<<*p<<endl;
}
}
2--------------------------------------------------------------------------------
putenv()//
可能成功,也可能不成功.因此不建议用它


setenv("
设置环境变量名","",是否覆盖); //建议用这个函数;

man  
用户命令  //(User Command),  在第一章

         C++
标准库函数  //(Standard C++ Library Funciton) ,  在第二章
         
系统调用    //(System Calls) UNIX 系统提供的,其他系统不能用.  在第三章 (3C)

User Comannd    //
标题
;
mkdir(1) "1" :  
表示在第几章
;

man -a setenv; //
查找所有的包括这个关键字的 [用户命令,标准C++库函数, 或者系统调用
] ;

*************************************************************************
*
*UNIX
下的几个习惯
:
*1.
如果一个函数的返回类型是指针则其返回类型是NULL; 如果不存在返回
NULL;
*2.
如果返回类型是整数: 如果成功返回非负数, 失败返回负数一般是
: -1
*
*************************************************************************

perror("
提示: "): 知道到底是哪个错误在屏幕上. 示例: "提示
: ................................."

man -s3C mkdir  //
指定要查找哪一章的内容
.

man -k dir      //
根据关键子来查找(模糊查找) 列出跟关键子相关的内容
.

man
---------------------------------------------------------------------------------
2:
进程
:
ps -u 295 //
查找用户的所有进程
;
T :
暂停状态;  fg %1  恢复状态; bg %1 a.out&  后台执行

S :
睡眠状态;  
O : oneline
正在执行的状态

R :
可执行状态 在进程堆里等待
Z :
僵尸进程
----------------------------------------------------------------------------------
3.
用户信息
:
#include <unistd.h>  //
要导入的头文件


char* getlogin() //
得到用户的登录名;
int getuid();  //
得到当前登录用户的用户
ID;
int getuid(); //
得到当前运行该进程的有效用户
ID;

#include <pwd.h>  //
要导入的头文件

struct passwd* getpwuid(int userid); //
取得用户的所有信息
;
get pw uid

struct passwd* getpwnam(int useid); //
根据用户名返回用户信息

get pwuid

如果不知道要到入哪个头文件. [man 函数] 就可以找到包含这个函数的头文件:
-----------------------------------------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc,char* argv[],char* env[])
{
char name[100];
cout<<"input you name or id"<<endl;
char ch;
ch=cin.peek;
passwd* p=NULL;
if(ch>='0' && ch<='9'){
cin>>uid;
getpwuid(uid)
else{
cin>>name;
p=getpwnam(name);
}
if(p==NULL)
cout<<;
else
{
cout<<p->pw_name<<enld;
cout<<p->pw_uid<<enld;
cout<<p->pw_name<<enld;
}
}

--------------------------------------------------------------------------------
(2)
文件系统

1.
概述
/
宏观: pwd ,删除,设置一个目录,
目录

            /
微观: 看目录的内容
:


绝对路径
(absolute path)
相对路径
(relative path)
   --------------------------------------------------------------------------
2.
目录

#include <unistd.h>
char* getcwd(char* buf,size_t_size)'cwd'=courrent working directory
 char* buf:   //
传一个字符数组名:(要把字符串放到指定的地方去)
size_t_size:  //
这个字符串有多大
.
1,
先准备好空间
;
2,
告知大小(把大小传过去
);
返回值 char*: 传什么过去,返回什么 (有返回值是为了方便使用
)
cout<<getcwd(buf,100)<<enld;
xxxx_t :  
表示整数类型
short long int;
pwd=  print working directory
  --------------------------------
例子
:
#include <iostream>
using namespace std;
#include <unistd.h>
int main(int argc,char* argv[],char* env[])
{
char name(256);    //
必需先准备好地方
;
getcwd(name,sizeof(name));   //
取当前目录的绝对路径
:
cout<<name<<endl;  
cout<<getcwd(name,sizeof(name))<<endl;  //
直接就可以输出
.
}
----------------------------------------------------------------------------------
新增知识
:
printf("%d
字符串%f%s")  //把占位符写出来
.
---------------------------------------------------------------------------------
有效用户,用户在执行这个程序的时候有编辑者同样的权限
.

----------------------------------------------------------------------------
2.
对目录的操作
.
int mkdir() //
创建一个目录

int rmidr(); //
删除一个目录
int chdir();  //
更改当前工作
当前目录相对于环境变量;退出进程环境变量就失效.
----------
例子
:
#include <iostream>
using namespace std;
#include <unistd.h>
#include <sys/stat.h>
//#include <sys/types.h>   //
可以导入也可以不导入这个头文件
.

int main()
{
       cout << "cmd:m name/r name/c name/g/q" << endl;
       char cmd;
       char name[256];
       for(;
       {
               cin >> cmd;
               switch( cmd )
               {
               case 'm':
                       cin >> name;
                       if(mkdir(name, 0755)<0)
                               cout << "Error!" << endl;
                       else
                               cout << "OK!" << endl;
                       break;
               case 'r':
                       cin >> name;
                       if(rmdir(name)<0)
                               cout << "Error!" << endl;
                       else
                               cout << "OK!" << endl;
                       break;
               case 'c':
                       cin >> name;
                       if(chdir(name)<0)
                               cout << "Error!" << endl;
                       else
                               cout << "OK!" << endl;
                       break;
               case 'g':
                       getcwd(name, sizeof(name));
                       cout << name << endl;
                       break;
               case 'q':
                       return 0;
               default:
                       cout << "Invalid cmd!" << endl;
                       break;
               }
       }
       return 0;
}
3.
查看指定的目录项
;
#include <sys/type.h>
#include <dirent.h>  //dir entry(
目录入口
)
DIR* opendir(const char* dirname); //
打开操作只有一次
.
DIR
是一个数据类型.  (未知类型
UFO )
struct dirent* readdir(); //
每次读一个目录项
;
//
返回类型也是指针: struct dirent* C++ 中不要 struct关键字 根据指针是否是 NULL 来判断是否读完
.
int closedir(DIR *dirp);
-----------------------------
例子
:
#include <iostream>
using namespace std;
#include <dirent.h>
                                                                                                   
int main( int argc, char* argv[] )
{
       if( argc==1 )
       {
               cout << *argv << " dir_name/n";
               return 0;
       }
       DIR* pd=opendir(argv[1]);
       if( pd==NULL )
       {
               cout << argv[1] << " not exist/n";
               return 0;
       }
       dirent* p=NULL;   // p
里面有d_name 成员

       while( (p=readdir(pd))!=NULL )
       {
               cout << p->d_name << endl;
       }
       closedir(pd);
       return 0;
}




3.
文件操作
UNIX
操作系统只提供少量接口例如: open() read() write() lseek()//调整读的位置
open()
文件名 和 文件描述符
;
系统给文件一个文件ID(文件描述符) 非负整数
.
- shell
三个标准描述符
(0,1,2)  (cin,cout,cerr)
open()
函数
:
int opne(const char* pathname,int oflag,..)
pathname;
int oflag:
<o_RDONLY|O_WRONLY+0_RDWR>   //
必需选一个,只能选一个

1.O_APPEND:
加到后面.
2.O_CREAT :
如果没有则要创见这个目录.如果存在打开
.
3.O_EXCL :
独占方式打开

4.O_TRUNC:
把原有内容清空.
23合并, 用于令牌控制.只允许一个人能够成功
.
只要执行2,就要指定权限
.
Read/Write
//
读到文件末尾,返回
0;
size_t read(int fd,void* buf,size_t nbytes);
fd;
buf;
要放的位置
.
size_t nbytes:
读的字节数
.

size_t write(int fg,void* buf,size_t nbytes);
fg:
buf:
nbytes:  
umask//
用户权限屏蔽; 例如: 0022 屏蔽指定:066. rw_rw_rw_ w的权限. 077屏蔽: 屏蔽其他的所有权限
.
umask()
也是函数
;
#include <iostream>
using namespace std;
#include <unistd.h>
#include <fcntl.h>

int main( int argc, char* argv[] )
{
       if( argc!=3 )
       {
               cout << *argv << " file newfile/n";
               return 0;
       }
       umask(0);   //
把权限屏蔽关掉 默认的 是02 或者
022
       int src=open(argv[1], O_RDONLY);
       if( src<0 )
       {
               cout << "cannot access " << argv[1] << endl;
               return 0;
       }
       int dst=open(argv[2], O_WRONLY|O_CREAT|O_EXCL, 0666);
       if( dst<0 )
       {
               cout << "cannot access " << argv[2] << endl;
               close(src);
               return 0;
       }
       char buf[1024];
       int len;
       while( (len=read(src, buf, 1024))>0 )
               write(dst, buf, len);
       close(src);
       close(dst);
       return 0;
}
----------------------------------------------------------------------
bianry_read
bianry_wreate 没听

----------------------------------------------------------------------

Lseek function
off_t lseek(int fd,off_t offset,int whence)
fd :
读写的文件
offset :
跳多远
whence :
从哪儿跳  有三个参数
SEEK_SET:
正偏移
SEEK_CUR:
从当前位置.
SEEK_END;
负偏移
.
//
到指定位置读写学生信息
.
--------------------------------------------
例子
:

#include <iostream>
using namespace std;
#include <unistd.h>
#include <fcntl.h>

struct ST{
       char name[20];
       double score;
};

int main()
{
       int fd=open("st.dat", O_RDWR|O_CREAT, 0600);
       if( fd<0 )
       {
               cout << "cannot access st.dat/n";
               return 0;
       }
       ST s;
       for( int i=0; i<3; i++ )
       {
               cout << "input name and score:";
               cin >> s.name >> s.score;
               write(fd, &s, sizeof(s));
       }
       cout << "input student no(1~3):";
       int no;
       cin >> no;
       lseek(fd, (no-1)*sizeof(ST), SEEK_SET);
       read(fd, &s, sizeof(s));
       cout << s.name << ',' << s.score << endl;
       close(fd);
       return 0;
}
---------------------------------------------------
             /unlink(const char* path);
删除文件
:
     /remove(const char* path);
改名子:   rename(oldname,newname);

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炼丹狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值