1. 概述:
该demo主要实现linux下文件的基本操作, linux系统调用, 以及标准IO调用, 相关接口介绍可以参考<
/*
file_tip.h
格式化I/O输出和输入相关接口介绍
*/
#include
/******************************格式化I/O输出*************************************/
int printf(const char *restrict format, ...);
int fprintf(FILE *restrict fp, const char *restrict format, ...);
int dprintf(int fd, const char *restrict format, ...);
/* 3个函数返回值:若成功,都返回输出字符数;若输出出错,都返回负值 */
int sprintf(char *restrict buf, const char *restrict format, ...);
/* 返回值:若成功,返回存入数组的字符数;若编码出错,返回负值 */
int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);
/* 返回值:若缓冲区足够大,返回将要存入数组的字符数;若编码出错,返回负值 */
/******************************格式化I/O输入*************************************/
int scanf(const char *restrict format, ...);
int fscanf(FILE *restrict fp, const char *restrict format, ...);
int sscanf(const char *restrict buf, const char *restrict format, ...);
/* 3个函数返回值:赋值的输入项数;若输入出错或在任一转换前已到达文件尾,都返回 EOF */
/*
demo_file_open.c
文件编程demo(linux系统调用)
基本操作 : 创建, 打开, 关闭, 读写, 文件偏移量, 文件同步, 权限判断, 文件删除
*/
#include
#include
#include
#include
#define MAX_BUF 64
#define FILENAME "./test_open.txt"
int main(int argc, char **argv){
int ret = -1;
int fd = -1;
char buf[MAX_BUF];
/*
创建文件
fd = creat(FILENAME, 700);
*/
/*
fd : STDIN_FILENO/0(标准输入) STDOUT_FILENO/1(标准输出) STDERR_FILENO/2(标准错误)
O_CREAT : 若此文件不存在, 则创建它
O_RDWR : 可读可写方式打开
O_RDONLY : 只读方式打开
O_WRONLY : 只写方式打开
O_APPEND : 追加
O_NONBLOCK : 非阻塞I/O
*/
fd = open(FILENAME, O_CREAT | O_RDWR | O_APPEND, 700);
if(fd < 0){
/*printf("open:%s\n", strerror(errno));*/
perror("open:");
return -1;
}
/*
F_OK : 判断文件是否存在
X_OK : 判断对文件是否可执行权限
W_OK : 判断对文件是否有写权限
R_OK : 判断对文件是否有读权限
*/
if(access(FILENAME, F_OK | W_OK | R_OK) < 0){
perror("access:");
goto err;
}
memset(buf, 0x0, sizeof(buf));
memcpy(buf, FILENAME, strlen(FILENAME));
if(write(fd, buf, strlen(buf)) < 0){
perror("write:");
goto err;
}
/*
SEEK_SET : 参数offset即为新的读写位置
SEEK_CUR : 以目前的读写位置往后增加offset个位移量
SEEK_END : 将读写位置指向文件尾后再增加offset个位移量
返回值 : 若成功, 返回新的文件偏移量(可用于计算文件大小)
*/
if(lseek(fd, 0, SEEK_SET) < 0){
perror("lseek:");
goto err;
}
printf("buf = ");
while(1){
memset(buf, 0x0, sizeof(buf));
ret = read(fd, buf, sizeof(buf));
if(ret < 0){
perror("read:");
break;
}
else if(ret == 0){
break;
}
printf("%s", buf);
}
printf("\n");
fsync(fd);
close(fd);
//sync();
//unlink(FILENAME);
return 0;
err:
fsync(fd);
close(fd);
//sync();
//unlink(FILENAME);
return -1;
}
/*
demo_file_fopen.c.c
文件编程demo(标准IO调用)
基本操作 : 打开/创建, 关闭, 二进制IO读写, 文件偏移量, 文件同步
*/
#include
#include
#include
#define MAX_BUF 64
#define FILENAME "./test_fopen.txt"
int main(int argc, char **argv){
int ret = -1;
FILE * fp = NULL;
char buf[MAX_BUF];
/*
FILE * file : 标准输入(stdin) 标准输出(stdout) 标准错误(stderr)
r(read) : 读
w(write) : 写
a(append) : 追加, 若文件不存在, 则会建立该文件
t(text) : 文本文件
b(banary) : 二进制文件
+ : 读和写
*/
fp = fopen(FILENAME, "a+");
if(fp == NULL){
/*printf("fopen:%s\n", strerror(errno));*/
perror("fopen:");
return -1;
}
/*
二进制IO读写
*/
memset(buf, 0x0, sizeof(buf));
memcpy(buf, FILENAME, strlen(FILENAME));
if(fwrite(buf, strlen(buf), 1, fp) < 0){
perror("fwrite:");
goto err;
}
/*
SEEK_SET : 文件的开头
SEEK_CUR : 文件指针的当前位置
SEEK_END : 文件的末尾
*/
if(fseek(fp, 0, SEEK_SET) < 0){
perror("fseek:");
goto err;
}
printf("buf = ");
while(1){
memset(buf, 0x0, sizeof(buf));
ret = fread(buf, sizeof(buf), 1, fp);
if(ret < 0){
perror("fread:");
break;
}
else if(ret == 0){
printf("%s", buf);
break;
}
printf("%s", buf);
}
printf("\n");
fflush(fp);
fclose(fp);
sync();
return 0;
err:
fflush(fp);
fclose(fp);
sync();
return -1;
}
#Makefile
CC := gcc
INCLUDE = -I /home/demo/include/
all:
$(CC) demo_file_open.c $(INCLUDE) -o demo_file_open -Wall -Werror
$(CC) demo_file_fopen.c $(INCLUDE) -o demo_file_fopen -Wall -Werror
clean:
rm demo_file_open demo_file_fopen