系统编程文件部分
This commit is contained in:
@@ -14,23 +14,145 @@
|
|||||||
/* stdio */
|
/* stdio */
|
||||||
/* FILE类型贯穿始终 */
|
/* FILE类型贯穿始终 */
|
||||||
|
|
||||||
FILE *fopen(const c);
|
FILE *fopen(const char *path, const char *mode);
|
||||||
fclose();
|
/**
|
||||||
|
* fopen 返回指针的储存位置? 1.栈 2.静态区 3.堆
|
||||||
|
* 正确答案:3.堆。
|
||||||
|
* 因为如果是栈,就是函数内部局部变量,无法返回地址。
|
||||||
|
* 如果是静态区,无法确定需要多少个这个变量。
|
||||||
|
*
|
||||||
|
* 只有 r 和 r+ 一定要求文件存在
|
||||||
|
* 另外几种不存在会创建
|
||||||
|
*
|
||||||
|
* 创建文件的权限
|
||||||
|
* 0666 & ~umask
|
||||||
|
*
|
||||||
|
* 对于普通用户
|
||||||
|
* umask 得到 022
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int fclose(FILE *fp);
|
||||||
|
|
||||||
fgetc();
|
int fputc(FILE *stream);
|
||||||
fputc();
|
int fgetc(int c, FILE *stream);
|
||||||
fgets();
|
|
||||||
fputs();
|
|
||||||
fread();
|
|
||||||
fwrite();
|
|
||||||
|
|
||||||
printf();
|
char *fgets(char *s, int size, FILE *stream);
|
||||||
scanf();
|
/**
|
||||||
|
* 两种正常返回的情况:
|
||||||
|
* 1. 读了 size-1 个字节,最后一个字节留给 '\0'
|
||||||
|
* 2. 读到了 '\n'
|
||||||
|
*
|
||||||
|
* eg. 加入用fgets(buf, 5, stream) 来读 abcd
|
||||||
|
* 是会读两次的
|
||||||
|
* 第一次:abcd'\0'
|
||||||
|
* 第二次:'\n''\0'
|
||||||
|
*/
|
||||||
|
int fputs(const char *restrict s, FILE *restrict stream);
|
||||||
|
|
||||||
fseek();
|
/**
|
||||||
ftell();
|
* 这一对函数常用但是无法验证边界
|
||||||
rewind();
|
* 尽量一次只读单字节,更安全
|
||||||
|
*
|
||||||
|
* 返回值:成功读/写的对象的数量
|
||||||
|
*/
|
||||||
|
size_t fread(void *ptr, size_t size, size_t nemmb, FILE *stream);
|
||||||
|
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
|
||||||
|
|
||||||
|
|
||||||
|
int printf(const char *restrict format, ...);
|
||||||
|
/**
|
||||||
|
* 常用于 fprintf(stderr,...)
|
||||||
|
*/
|
||||||
|
int fprintf(FILE *restrict stream, const char *restrict format, ...);
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
int dprintf(int fd, const char *restrict format, ...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将格式化内容输出到一个字符串
|
||||||
|
*
|
||||||
|
* 和 atoi() 正好相反
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int sprintf(char *restrict str, const char *restrict format, ...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 比sprintf多了size参数,更安全
|
||||||
|
*/
|
||||||
|
int snprintf(char str[restrict.size],
|
||||||
|
size_t size,
|
||||||
|
const char *restrict format,
|
||||||
|
...)
|
||||||
|
|
||||||
|
// !!! 慎用%s
|
||||||
|
int scanf(const char *restrict format, ...);
|
||||||
|
int fscanf(FILE *restrict stream,
|
||||||
|
const char *restrict format, ...);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动文件当前位置指针
|
||||||
|
*
|
||||||
|
* 可用于生成空洞文件,下载器原理
|
||||||
|
*
|
||||||
|
* @prarm: offset 移动多远
|
||||||
|
* @prarm: whence 移动方向
|
||||||
|
* SEEK_SET, SEEK_CUR, SEEK_END
|
||||||
|
*
|
||||||
|
* @return 成功0,失败-1
|
||||||
|
*/
|
||||||
|
int fseek(FILE *stream, long offset, int whence);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 反映当前文件指针所在位置
|
||||||
|
*
|
||||||
|
* 这个long的负值部分无法使用。
|
||||||
|
* 所以文件无法超过2G。
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
long ftell(FILE *stream);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 解决上面long的问题。
|
||||||
|
*
|
||||||
|
* 最好编译时加上
|
||||||
|
* #define _FILE_OFFSET_BITS 64
|
||||||
|
* 可以写入makefile
|
||||||
|
*
|
||||||
|
* 但是这俩函数是方言,前面那个long的一对支持C89,C99
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int fseeko(FILE *stream, off_t offset, int whence);
|
||||||
|
off_t ftello(FILE *stream);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将文件指针置于文件首
|
||||||
|
* equivalent to:
|
||||||
|
* fseek(stream, 0L, SEEK_SET);
|
||||||
|
*/
|
||||||
|
void rewind(FILE *stream);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓冲区的作用:
|
||||||
|
* 大多数情况下是好事,合并系统调用
|
||||||
|
*
|
||||||
|
* 行缓冲: 换行时候刷新,满了的时候刷新,强制刷新(标准输出是这样的,因为是终端设备)
|
||||||
|
*
|
||||||
|
* 全缓冲: 满了的时候刷新,强制刷新(默认,只要不是终端设备)
|
||||||
|
*
|
||||||
|
* 无缓冲: 如stderr,需要立即输出的内容
|
||||||
|
*/
|
||||||
fflush();
|
fflush();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @prarm: mode
|
||||||
|
* _IONBF
|
||||||
|
* _IOLBF
|
||||||
|
* _IOFBF
|
||||||
|
*/
|
||||||
|
int setvbuf(FIEL *stream, char *buf, int mode, size_t size);
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
P131
|
||||||
28
Chapter13/io/stdio/atoi.c
Normal file
28
Chapter13/io/stdio/atoi.c
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
int year = 2014, month = 5, day = 13;
|
||||||
|
|
||||||
|
printf("%d-%d-%d\n", year, month, day);
|
||||||
|
|
||||||
|
sprintf(buf, "%d-%d-%d", year, month, day);
|
||||||
|
puts(buf);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
char str[] = "123456";
|
||||||
|
|
||||||
|
printf("%d\n", atoi(str));
|
||||||
|
/**
|
||||||
|
* 输出 123456
|
||||||
|
*
|
||||||
|
* 如果str是123a456
|
||||||
|
* 输出123
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
20
Chapter13/io/stdio/fflush.c
Normal file
20
Chapter13/io/stdio/fflush.c
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// 这里不加\n的话,什么都不输出
|
||||||
|
// 要么加\n,要么fflush
|
||||||
|
printf("Before while()");
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
|
||||||
|
printf("After while()");
|
||||||
|
fflush(NULL);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
32
Chapter13/io/stdio/fgetc.c
Normal file
32
Chapter13/io/stdio/fgetc.c
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage...\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(argv[1], "r");
|
||||||
|
if (NULL == fp)
|
||||||
|
{
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (EOF != fgetc(fp))
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("count = %d", count);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
28
Chapter13/io/stdio/flen.c
Normal file
28
Chapter13/io/stdio/flen.c
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
if (argc < 2)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage...\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fp = fopen(argv[1], "r");
|
||||||
|
if (NULL == fp)
|
||||||
|
{
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
|
||||||
|
printf("%d\n", ftell(fp));
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
@@ -25,5 +25,7 @@ int main()
|
|||||||
|
|
||||||
puts("OK!");
|
puts("OK!");
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
32
Chapter13/io/stdio/maxfopen.c
Normal file
32
Chapter13/io/stdio/maxfopen.c
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
FILE *fp = NULL;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
|
||||||
|
fp = fopen("tmp", "w");
|
||||||
|
if (NULL == fp)
|
||||||
|
{
|
||||||
|
perror("fopen()");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("count = %d\n", count);
|
||||||
|
// out: 4089
|
||||||
|
/* 可以通过下面这个命令限制 */
|
||||||
|
/* ulimit -n */
|
||||||
|
/* 4096 */
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
51
Chapter13/io/stdio/mycpy.c
Normal file
51
Chapter13/io/stdio/mycpy.c
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* @details
|
||||||
|
* usage: ./mycpy <src> <dst>
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *fps, *fpd;
|
||||||
|
int ch;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage:%s <src> <dst>\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fopen(argv[1], "r");
|
||||||
|
if (NULL == fps)
|
||||||
|
{
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fopen(argv[2], "w");
|
||||||
|
if (NULL == fpd)
|
||||||
|
{
|
||||||
|
// !!!
|
||||||
|
fclose(fps);
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
ch = fgetc(fps);
|
||||||
|
if (EOF == ch)
|
||||||
|
break;
|
||||||
|
fputc(ch, fpd);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fpd);
|
||||||
|
fclose(fps);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
48
Chapter13/io/stdio/mycpy_fgets.c
Normal file
48
Chapter13/io/stdio/mycpy_fgets.c
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define BUFSIZE 1024
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* @details
|
||||||
|
* usage: ./mycpy <src> <dst>
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *fps, *fpd;
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage:%s <src> <dst>\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fopen(argv[1], "r");
|
||||||
|
if (NULL == fps)
|
||||||
|
{
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fopen(argv[2], "w");
|
||||||
|
if (NULL == fpd)
|
||||||
|
{
|
||||||
|
// !!!
|
||||||
|
fclose(fps);
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (NULL != fgets(buf, BUFSIZE, fps))
|
||||||
|
fputs(buf, fpd);
|
||||||
|
|
||||||
|
fclose(fpd);
|
||||||
|
fclose(fps);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
50
Chapter13/io/stdio/mycpy_fread.c
Normal file
50
Chapter13/io/stdio/mycpy_fread.c
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define BUFSIZE 1024
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* @details
|
||||||
|
* usage: ./mycpy <src> <dst>
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *fps, *fpd;
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
int n;
|
||||||
|
|
||||||
|
if (argc < 3)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage:%s <src> <dst>\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fopen(argv[1], "r");
|
||||||
|
if (NULL == fps)
|
||||||
|
{
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
fopen(argv[2], "w");
|
||||||
|
if (NULL == fpd)
|
||||||
|
{
|
||||||
|
// !!!
|
||||||
|
fclose(fps);
|
||||||
|
perror("fopen()");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 用n接收读到的个数,因为不知道能不能正好读到BUFSIZE */
|
||||||
|
while ((n = fread(buf, 1, BUFSIZE, fps)) > 0)
|
||||||
|
fread(buf, 1, n, fpd);
|
||||||
|
|
||||||
|
fclose(fpd);
|
||||||
|
fclose(fps);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user