一.系统编程 --- 标准函数(复习老知识)
1. int fgetc(FILE *stream);
作用:从文件中读取一个字符。(内存获取--从文件读出来)
参数:stream 是fopen的返回值。文件结构体。
返回值:如果成功获取到的字符的sacii值,如果失败返回EOF 就是-1;
请把danny.log文件的所有内容全部读取出来。
2. int fputc(int c, FILE *stream);
作用:写一个字符到文件中(内存中数据到文件中)
参数:c 是需要写入文件是字符ascii
stream 是fopen的返回值
返回值:如果成功返回写入的字符,失败返回EOF
补充: perror是打印错误信息,使用perror(字符串);
在文件中会有一个全局变量errno,记录的是最后一次的错误信息
错误信息对应一个字符串,perror会把字符串内容打印。
3. char *fgets(char *s, int size, FILE *stream);
作用: 从文件中读取一个字符串
参数:s 缓冲区,用来存放读取到的字符串。
size 大小,一次性读取的字符个数
stream :fopen的返回值
返回值:如果成功返回读取到的字符首地址,如果失败返回NULL
注意:实际读取到的字符是size-1个,会自动在后面加‘\0’;
4.int fputs(const char *s, FILE *stream);
作用:写入字符串到文件中
参数: s 需要写入的字符串首地址
stream:fopen的返回值
返回值:如果成功返回实际写入文件的字符个数,失败返回EOF
注意:写入的时候不会把字符串的'\0'写入到文件中
5. 在文件内部,有一个专门处理光标位置的指针,文件偏移指针
6.int fseek(FILE *stream, long offset, int whence);
功能:移动文件偏移指针到指定位置,
参数: offset:偏移多少字节,负数则往左偏移,整数往右偏移
whence: SEEK_SET 从文件头开始
SEEK_CUR 从当前位置开始
SEEK_END 从文件末尾开始
7. 函数原型:long ftell(FILE *stream);
功能:返回文件偏移指针位置
参数:fopen的返回值
返回值:光标所在位置,文件偏移指针位置。
8.void rewind(FILE *stream);
作用:把文件光标移动在文件头
参数:fopen返回值
返回值:无
9.int feof(FILE *stream);
作用:判断文件是否结束
参数: 文件结构体指针 fopen返回值
返回值:如果文件结束返回真,如果文件未结束返回假(0)
注意:错误信息保存在errno,可以用perror打印、
10. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
作用:读二进制文件到内存中
参数: ptr 是缓冲区,用来存放读取的二进制内容,
size 每一块的大小
nmemb:读的块数,总共读取几块,总大小是size* nmemb
stream : 文件的结构体指针,fopen的返回值
返回值:实际读取到的块个数。小于等于nmemb的值。
11.size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
作用:写入二进制到文件
参数: ptr 是缓冲区,用来存放写入文件的内容,
size 写入每一块的大小
nmemb:写的块数,总共写入几块,总大小是size* nmemb
stream : 文件的结构体指针,fopen的返回值
返回值:实际写入文件的个数。小于等于nmemb的值。
12.int fscanf(FILE *stream, const char *format, ...); (自学内容)
作用:读取文件内容到内存中
参数:stream 文件指针 fopen返回值
format 格式化处理字符串
13. int fprintf(FILE *stream, const char *format, ...); (自学内容)
作用:写入内容到文件中
参数:stream 文件指针 fopen返回值
format 格式化处理字符串
14 一些命令
ln -s 创建软链接
ln 创建硬链接
mkfifo 创建管道文件
二.系统函数
open()函数:
int open(const char *pathname, int flags, mode_t mode);
使用open函数需要的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
open()的返回值:
返回一个文件描述符,当文件成功打开时,返回一个非负整数,当文件打开失败时,返回-1
参数:const char *pathname:
文件路径名(绝对路径)或者文件名
int flags:选择打开文件的操作,分别为:
● O_RDONLY 只读
● O_WRONLY 只写
● O_RDWR 可读可
当然我们可以与上另外一些可选常量,展示不同的功能:
如:O_RDWR | O_CREAT 可读可写且当打开这个文件时,该文件不存在则创建它
● O_CREAT 当打开这个文件时,该文件不存在则创建它,需要搭配第三个参数使用
● O_APPEND 每次往这个文件写新的内容时,新的内容总是加到文件的末端
即打开文件后进行写操作时(调用write()),若该文件原先有内容,则不会覆盖原来的内容,而是在末端添加内容
● O_TRUNC 清空内容
● O_EXCL 若同时与上该常量与 O_CREAT,当需要打开的文件存在时,open()会返回一个整型数-1
mode_t mode:(可选参数) 0666
write()函数:
ssize_t write(int fd, const void *buf, size_t count);
使用write函数需要的头文件:
#include <unistd.h>
write()的返回值:
写入成功时,返回写入的字节数(零表示没有任何内容)
如果const void *buf为零,并且fd引用常规文件,则write()可能会返回-1
如果检测到,或未执行错误检测,则将返回0,而不进行任何更改
int fd:使用open()时返回的文件描述符
void *buf: 内存,一般传内存地址,如数组名,指针名)
size_t count: 写入字节数
read()函数:
ssize_t read(int fd, void *buf, size_t count);
使用read函数需要的头文件:
#include <unistd.h>
read()的返回值:成功时,返回读取的字节数(零表示结束)出现错误时,返回-1
参数:int fd: 使用open()时返回的文件描述符
void *buf: 内存,一般传内存地址,如数组名,指针名
size_t count: 读取字节数
经典知识的图片:
记住这些知识 (加油)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#define FILEmy "5.txt"
//文件描述符号的分配规则,
//open函数 的使用
int main(int argc,char *argv[])
{
int fd=open(FILEmy,O_RDONLY);
if(fd <0)
{
perror("open error\n");
printf("fd =%d",fd);
return -1;
}
printf("fd =%d\n",fd);
//一个文件可以打开多次 并且文件描述符号不同
int fd1=open(FILEmy,O_RDONLY);
printf("fd1 =%d\n",fd1);
int fd2=open(FILEmy,O_RDONLY);
printf("fd2 =%d\n",fd2);
int fd3=open(FILEmy,O_RDONLY);
printf("fd3 =%d\n",fd3);
int fd4=open(FILEmy,O_RDONLY);
printf("fd4 =%d\n",fd4);
close(fd);
close(fd1);
close(fd2);
close(fd3);
close(fd4);
//open 的第三个参数
//测试 O_TRUNC 清空写 参数的功能
//O_APPEND 追加写
/*
int fp =open(FILEmy,O_RDWR| O_CREAT |O_TRUNC,0666);
if(fp <0)
{
perror("open error");
return -2;
}
printf("fp =%d\n",fp);
close(fp);
*/
//O_APPEND 追加写
int fp2 =open(FILEmy,O_RDWR| O_CREAT |O_APPEND,0666);
if(fp2 <0 )
{
perror("open fp1");
return -3;
}
char buff[100];
strcpy(buff,"makkkda");
write(fp2,buff,strlen(buff));
close(fp2);
//报错函数 strerror
int len = write(fp2, buff,strlen(buff));
printf("errno is %d %s \n", errno, strerror(errno));
printf("len =%d \n",len);
printf("file operation \n");
return 0;
}
/************************************************************************************************************************************************************************************************************************
*文件名:
*作 者:She001
*时 间:
*版 本:
*作 用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
//1.目标 fdopen 和 fileno 的用法
int main(int argc,char *argv[])
{
/*
//转换自定义指针 把文件描述符 变成文件流
FILE *fp= fdopen(STDIN_FILENO,"r+");
if(fp==NULL)
{
perror("fdopen errer!\n");
return -1;
}
char w[100];
fgets(w,sizeof(w),fp);
//输到 屏幕上
fputs(w,stdout);
//清空w 的空间
bzero(w,sizeof(w));
fgets(w,sizeof(w),stdin);
puts(w);
*/
/*
//文件流(FILE *) 转化 为 文件描述符(int)
int mystdout = fileno(stdout);
printf("mystdout is %d\n", mystdout);
char * str ="this is tuesday\n";
write(mystdout,str,strlen(str));
write(STDOUT_FILENO,"hello!\n",7);
*/
int mystderr = fileno(stderr);
printf("mystderr is %d\n", mystderr);
char * str ="this is tuesday\n";
write(mystderr,str,strlen(str));
return 0;
}
/************************************************************************************************************************************************************************************************************************
*文件名:
*作 者:She001
*时 间:
*版 本:
*作 用:
****************************************************************************************************************************************************************************************************************************/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdbool.h>
#include<time.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
printf("this is %s test start\n ",__func__);
printf("stdin: %d %d \n", STDIN_FILENO,stdin->_fileno);
printf("stdin: %d %d \n", STDOUT_FILENO,stdout->_fileno);
printf("stdin: %d %d \n", STDERR_FILENO,stderr->_fileno);
printf("this is %s test end\n ",__func__);
return 0;
}