一、Linux文件操作变量、数组、数据结构-------------》内存 读写数据速度快程序执行结束、掉电数据丢失空间小价格昂贵文件 --------------》外存硬盘读写速度比内存慢2. 掉电数据不丢失 2. 空间大相对内存价格便宜1. 文件xxx.c xxx.c xxx.txt xxx.jpg xxx.mp4 /dev/fb0 /etc长期保存掉电不丢失的数据。Linux提供给应用层的硬件操作接口一切皆文件2. Linux下文件类型Linux下一切皆文件。ls -l 文件名查看文件具体信息-rwxrwxr-x 1 linux linux 19856 Aug 14 19:20 a.out -rw-rw-r-- 1 linux linux 6999 Aug 14 19:20 link.c -rw-rw-r-- 1 linux linux 1240 Aug 14 19:20 link.h -rw-rw-r-- 1 linux linux 1438 Aug 14 19:06 main.c -rw-rw-r-- 1 linux linux 105 Aug 14 19:07 Makefile7种文件类型b block 块设备文件 如存储类文件硬盘 c charector 字符设备文件 如鼠标、键盘、显示器... d directory 目录文件 如文件夹 - regular 普通文件 如main.c xxx.h xxx.txt xxx.jpg a.out l link 软连接文件 相当于快捷方式符号链接 s socket 套接字文件 网络编程 p pipe 管道文件 进程间通信- 普通文件 二进制文件 : 0101010101 2026--011111101010 a.out 9.png xxx.mp3 ASCII文件 h e l l o 2026---2 0 2 6 cat od -c xxx.c xxx.h xxx.txt3. Linux下文件操作方法IOinput/output----》文件标准IO标准C库提供的文件操作接口属于库函数。#include stdio.hprintfscanfgetsputs文件IOLinux内核提供的文件操作接口属于系统调用。文件操作思想1. 打开文件 1. 读文件、写文件 1. 关闭文件4. 标准IO打开文件 fopen()读文件、写文件 : fgetc()/fputc()、fgets()/fputs()、fread()/fwrite()关闭文件 : fclose()man手册Linux命令 ls catman lsman 1 ls系统调用man openman 2 open库函数fopen/fread/fcloseman fopen文件流文件在读写过程中所体现出来的字节流。 FILE 文件流指针FILE * 标准IO文件操作面向文件流指针fopenFILE *fopen(const char *pathname, const char *mode); 功能打开一个文件并获得一个文件流指针 参数 pathname要打开的文件的文件名 mode打开方式 r : 以只读方式打开文件必须要存在 r : 以读写方式打开文件必须要存在 w : 以只写方式打开文件不存在则创建文件存在则清空 w : 以读写方式打开文件不存在则创建文件存在则清空 a : 以只写方式打开文件不存在则创建写时追加写 a : 以读写方式打开文件不存在则创建读从开头读写从末尾写 返回值 成功FILE * 文件流指针 失败NULL ​fcloseint fclose(FILE *stream); 功能关闭文件 参数 stream已打开的文件的文件留置针 返回值 成功0 失败EOF-1 注意 1. 只打开文件而使用完不关闭文件造成文件描述符泄露。fputcint fputc(int c, FILE *stream); 功能向文件中写入一个字符 参数 c要写入的字符或者字符对应的ASCII值 stream要写入的文件的文件流指针 返回值 成功写入的字符 失败EOF-1 putchar(a); fputc(a, stdout);操作系统默认已打开的三个流FILE *stdin 标准输入流 -------------》标准输入设备键盘stdout标准输出流 -------------》标准输出设备显示屏终端stderr标准出错流 -------------》标准出错设备显示屏终端fgetcint fgetc(FILE *stream); 功能从文件中读取一个字符 参数 stream要读取的文件的文件流指针 返回值 成功返回读到的字符 失败EOF-1 读到文件末尾EOF-1练习使用fgetc将文件中的数据读出打印到终端2. 使用主函数传参的方式实现一个cp的功能int main(int argc, const char *argv[]) { if (argc 3) { printf(Usage: ./a.out srcfile dstfile\n); return -1; } ​ FILE *fpsrc fopen(argv[1], r); FILE *fpdst fopen(argv[2], w); if (NULL fpsrc || NULL fpdst) { printf(fopen error\n); return -1; } int ret 0; while (1) { ret fgetc(fpsrc); if (EOF ret) { break; } fputc(ret, fpdst); } ​ fclose(fpsrc); fclose(fpdst); ​ return 0; } ​主函数传参可以在程序运行时利用命令行参数向主函数传参。命令行传参 ./mycat 1.txt aaa bbb ccc ​ 主函数形参 argc 命令行传递的参数个数 ----》4 argv 保存多个char*类型指针的数组 argv[0] ----./mycat argv[1] ----1.txt argv[2] ----aaa ... ​ ​ ./mycat 1.txt int main(int argc, const char *argv[]) { if (argc 2) { printf(Usage : ./a.out filename\n); return -1; } argv[0] ./mycat; argv[1] 1.txt }fputsint fputs(const char *s, FILE *stream); 功能将一个字符串写入到文件不包括\0字符(0) 参数 s要写入的字符串的首地址 stream要写入的文件的文件流指针 返回值 成功0 失败EOF-1od -c 1.txt 以字符方式显示文件中的内容fgetschar *fgets(char *s, int size, FILE *stream); 功能从文件中读取一行遇到新行结束 参数 s存储读取到的数据的空间首地址 size期待读到的字节数最多size-1 stream要读的文件的文件流指针 返回值 成功:返回s存储数据的空间首地址 失败NULL 到达文件末尾NULLfgets和fputs实现文件拷贝 int file_cp(const char *srcfile, const char *dstfile) { FILE *fpsrc fopen(srcfile, r); FILE *fpdst fopen(dstfile, w); if (NULL fpsrc || NULL fpdst) { printf(fopen error\n); return -1; } char buff[1024] {0}; ​ while (NULL ! fgets(buff, sizeof(buff), fpsrc)) { fputs(buff, fpdst); } ​ fclose(fpsrc); fclose(fpdst); ​ return 0; } ​注意fgets和fputs主要用来按行操作ASCII文件不能读写二进制文件fputs无法写入0。gets和fgets区别fgets会读取终端输入的\n字符在\n字符后面增减\0 gets不会读取\n, 直接在字符串末尾加\0.gets是危险的fgets是安全的因为fgets有读取数据大小参数控制。fgets最多读取size-1个字节最后位置留给\0。scanf()遇到空格、tab、换行停止读入。fwritesize_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 功能向文件中写入大小是size的nmemb个元素 参数 ptr要写入的元素的首地址 size每个元素的字节数 nmemb要写入的元素的个数 stream要写入的文件流指针 返回值 成功实际写入的元素个数 失败 nmembfreadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能从文件中读取大小是size的nmemb个元素到ptr指针指向的内存空间 参数 ptr用来存储读到数据的空间首地址 size每个元素的字节数 nmemb希望读取的元素个数 stream要读的文件流指针 返回值 成功返回实际从文件中读到的元素个数 当文件中不足一个元素时返回0流定位函数fseekint fseek(FILE *stream, long offset, int whence); 功能重新定位流的位置 参数 stream要定位的文件流指针 offset偏移量字节 whence要偏移的相对位置 SEEK_SET : 从文件开头偏移 SEEK_CUR 从当前位置偏移 SEEK_END 从文件末尾偏移 返回值 成功0 失败-1ftelllong ftell(FILE *stream); 功能获取流所在位置到文件开头的偏移量rewindvoid rewind(FILE *stream); 功能将流复位到开头求文件大小fseek(fp, 0, SEEK_END); len ftell(fp); rewind(fp);抢占磁盘空间创建空洞文件提前抢占磁盘空间5.时间相关函数time()#include time.h ​ time_t time(time_t *tloc); 功能获取1970-1-1 000000到现在的秒数 参数 tloc保存秒数的变量的地址 返回值 获得的秒数 ​ctime()char *ctime(const time_t *timep); 功能将秒数转换成字符串时间 参数 timep 秒数的变量的地址 返回值 字符串时间localtiome()struct tm *localtime(const time_t *timep); 功能将秒数转换成日历时间 ​ struct tm { int tm_sec; /* Seconds (0-60) */ int tm_min; /* Minutes (0-59) */ int tm_hour; /* Hours (0-23) */ int tm_mday; /* Day of the month (1-31) */ int tm_mon; /* Month (0-11) */ int tm_year; /* Year - 1900 */ int tm_wday; /* Day of the week (0-6, Sunday 0) */ int tm_yday; /* Day in the year (0-365, 1 Jan 0) */ int tm_isdst; /* Daylight saving time */ }; ​