C标准库——
stdio.h 头文件定义了三个变量类型,一些宏和各种函数来执行输入和输出。
库函数
size_t 这是无符号整数类型,它是sizeof关键字的结果。
FILE 这是一个适合存储文件流信息的对象类型。
fpos_t 这是一个适合存储文件中任何位置的对象类型。
库宏
NULL
_IOFBF 、_IOLBF 和 _IONBF 这些宏扩展了带有特定值的整形常量表达式,并适用于setvbuf函数的第三个参数。
BUFSIZ 这个宏是一个整数,该整数代表了setbuf函数使用的缓冲区大小。
EOF 这个宏是一个表示已经到达文件结束的负整数。
FOPEN_MAX 这个宏是一个整数,该整数代表了系统可以同时打开的文件数量。
FILENAME_MAX 这个宏是一个整数,该整数代表了字符数组可以存储的文件名的最大长度。如果实现没有任何限制,则该值应为推荐的最大值。
stderr、stdin和stdout 这些宏是指向FILE类型的指针,分别对应于标准错误、标准输入和标准输出流。
库函数
int fclose(FILE *stream) 关闭流stream, 刷新所有的缓冲区
void main()
{
FILE *fp;
fp = fopen("Jack.txt", "w");
fprintf(fp, "哈哈哈: %s", "让我做个自我介绍,我叫李树。\n");
fclose(fp);
getchar();
}
void clearerr(FILE *stream) 清除给定流stream的文件结束和错误标识符
void main()
{
FILE *fp;
char c;
fp = fopen("Jack.txt", "w");
c = fgetc(fp); //试图读取一个以只读模式打开的文件,将发生错误
if(ferror(fp))
{
printf("读取文件 Jack.txt时发生错误。\n"); //将会执行
}
clearerr(fp);
if(ferror(fp))
{
printf("读取文件时发生错误。\n"); //不会执行,因为错误已清除
}
fclose(fp);
getchar();
}
int feof(FILE *stream) 测试给定流stream的文件结束标识符
返回值:当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零。
void main()
{
FILE *fp;
int c;
fp = fopen("Jack.txt", "r");
if(fp == NULL)
{
perror("打开文件时发生错误。\n");
return;
}
while(1)
{
c = fgetc(fp);
if(feof(fp))
{
break;
}
printf("%c", c);
}
fclose(fp);
getchar();
}
int ferror(FILE *stream) 测试给定流stream的错误标识符
返回值: 如果设置了与流相关联的错误标识符,该函数返回一个非零值,否则返回一个零值。
int fflush(FILE *stream) 刷新流stream的输出缓冲区
返回值:如果成功,该函数返回零值。如果发生错误,则返回EOF, 且设置错误标识符。
int fgetpos(FILE *stream, fpost_t *pos)
void main()
{
FILE *fp;
fpos_t position;
fp = fopen("Jack.txt", "w+");
fgetpos(fp, &position); //获取文件的初始位置
fputs("today is October 9 2018", fp);
fsetpos(fp, &position); //回到文件的初始位置
fputs("Tomorrow is a new day.\n", fp);
fclose(fp);
getchar();
}
FILE *fopen(const char *filename, const char *mode) 使用给定的模式mode打开filename所指向的文件。
打开模式有:
r 打开一个用于读取的文件,该文件必须存在
w 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有的文件的内容, 文件被视为一个新的空文件。
a 追加到一个文件,写操作向文件末尾追加数据。如果文件不存在,则创建文件。
r+ 打开一个用于更新的文件,可读取也可写入,该文件必须存在。
w+ 创建一个用于读写的空文件。
a+ 打开一个用于读取和追加的文件
rb+
wb+
ab+
返回值:该函数返回一个FILE指针,否则返回NULL,且设置全局变量errno来标识错误。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流stream 读取数据到ptr所指向的数组中。
ptr 这是指向内存块的指针
size 这是要读取的每个元素的大小,以字节为单位。
nmemb 这是元素的个数,每个元素的大小为size字节
stream 指向FILE对象的指针,该FILE对象指定了一个输入流
void main()
{
FILE *fp;
char c[] = "My name is Jack.\n";
char str[24];
fp = fopen("Jack.txt", "w+");
fwrite(c, strlen(c) + 1, 1, fp);
fseek(fp, SEEK_SET, 0);
fread(str, strlen(c) + 1, 1, fp);
printf("str = %s\n", str);
fclose(fp);
getchar();
}
FILE *freopen(const char *filename, const char *mode, FILE *stream)把一个新的文件名filename与给定的打开的流stream关联,同时关闭流中中旧文件。
返回值:如果文件成功打开,则函数返回一个指针,指向用于标识流的对象。
int fseek(FILE *stream, long int offset, int whence) 设置流stream的文件位置为给定的偏移offset, 参数offset 意味着从给定的whence位置查找的字节数。
stream 这是指向FILE对象的指针,该FILE对象标识了流
offset 这是相对whence的偏移量, 以字节为单位
whence 这是表示开始添加偏移offset的位置。它一般指定为下列常量之一:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
返回值:如果成功,则该函数返回零,否则返回非零值。
void main()
{
FILE *fp;
char str[36];
fp = fopen("Jack.txt", "w+");
fputs("This is JackDiligent.", fp);
fseek(fp, 7, SEEK_SET);
fputs(" C programming language.", fp);
fclose(fp);
fp = fopen("Jack.txt", "r+");
fread(str, 36, 1, fp);
printf("str = %s", str);
fclose(fp);
getchar();
}
image.png
int fsetpos(FILE *stream, const fpos_t *pos) 设置给定流stream的文件位置为给定的位置。参数pos是由函数fgetpos给定的位置。
long int ftell(FILE *stream) 返回给定流stream的当前文件位置
返回值:该函数返回位置标识符的当前值。如果发生错误,则返回-1L,全局变量errno被设置为一个正值。
void main()
{
FILE *fp;
int nLen;
fp = fopen("Jack.txt", "r");
if(fp == NULL)
{
perror("打开文件错误。");
return;
}
fseek(fp, 0, SEEK_END);
nLen = ftell(fp);
fclose(fp);
printf("Jack.txt的总大小为 %d\n", nLen);
getchar();
}
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)把ptr所指向的数组中的数据写入到给定流stream中。
void main()
{
FILE *fp;
char str[] = "I am alive to be those who stand at the top of pyramid.";
fp = fopen("Jack.txt", "w");
fwrite(str, sizeof(str), 1, fp);
fclose(fp);
getchar();
}
int remove(const char *filename) 删除给定的文件名 filename, 以便它不再被访问。
返回值:如果成功,则返回零。如果错误,则返回-1,并设置errno.
int rename(const char *old_filename, const char *new_filename) 把old_filename所指向的文件名改为new_filename。
返回值:如果成功,则返回零;如果错误,则返回-1,并这是errno.
void rewind(FILE *stream) 设置文件位置为给定流stream文件的开头。
就是将光标返回文件开始处。
返回值:该函数不返回任何值。
void setbuf(FILE *stream, char *buffer) 定义流stream应如何缓冲。该函数应在与流stream相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。
int setvbuf(FILE *stream, char *buffer, int mode, size_t size)定义流stream应如何缓冲。
stream 这是指向FILE对象的指针,该FILE对象标识了一个打开的流。
buffer 这是分配给用户的缓冲,如果设置为NULL, 该函数会自动分配一个指定大小的缓冲。
mode 这指定了文件缓冲的模式:
_IOFBF 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
_IOLBF 行缓冲:对于输出,数据会遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
_IONBF 无缓冲:不使用缓冲。每个I/O操作都被即时写入。buffer和size参数被忽略。
返回值: 如果成功,则该函数返回0, 否则返回非零值。
#include <unistd.h>
void main()
{
char cBuffer[512];
memset(cBuffer, 0, sizeof(cBuffer));
fprintf(stdout, "启用全缓冲\n");
setvbuf(stdout, cBuffer, _IOFBF, 512);
fprintf(stdout, "Hello, JackDiligent.\n");
fflush(stdout);
fprintf(stdout, "休眠3秒钟\n");
sleep(3);
getchar();
}
FILE *tmpfile(void) 以二进制更新模式(wb+)创建临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除。
返回值:如果成功,该函数返回一个指向被创建的临时文件的流指针。如果文件未被创建,则返回NULL.
void main()
{
FILE *fp;
fp = tmpfile();
if(fp != NULL)
printf("临时文件被创建。\n");
fclose(fp);
getchar();
}
char *tmpnam(char *str)生成并返回一个有效的临时文件名,该文件名之前是不存在的。如果str为空,则只会返回临时文件名。
返回值:一个指向C字符串的指针,该字符串存储了临时文件名。如果str是一个空指针,则该指针指向一个内部缓冲区,缓冲区在下一次调用函数时会被覆盖。
如果str不是一个空指针,则返回str。如果函数未能创建成功,则返回一个空指针。
#include <stdio.h>
void main()
{
char buffer[100];
char *ptr;
tmpnam(buffer);
printf("临时名称1为:%s\n", buffer);
ptr = tmpnam(NULL);
printf("临时名称2为:%s\n", ptr);
}
image.png
int fprintf(FILE *stream, const char *format...)发送格式化输出到stream中。
返回值:如果成功,则返回写入的字符总数,否则返回一个负数。
#include <stdio.h>
void main()
{
FILE *fp;
int nLen;
fp = fopen("Jack.txt", "w+");
nLen = fprintf(fp, "%s %s %s %s %d", "Life", "is", "always","tough", 2018);
fclose(fp);
printf("nLen = %d\n", nLen);
getchar();
}
image.png
image.png
int printf(const char *format..)发送格式化输出到标准输出stdout.
返回值:如果成功,则返回写入的字符总数,否则返回一个负数。
#include <stdio.h>
void main()
{
char *p;
int i = 5;
long l = 0x888;
float f = 8.88;
int nLen;
printf("i = % d\n", i); //加空格
printf("i = %+d\n", i); //加‘+’号
printf("i = %10d\n", i); //右对齐
nLen = printf("i = %05d\n", i); //左填充0
printf("nLen = %d\n", nLen);
printf("l = %d\n", l);
printf("l = %o\n", l); //八进制
printf("l = %#o\n", l); //显示进制符0
printf("l = %x\n", l); //十六进制
printf("l = %#x\n", l); //显示进制符0x
printf("fp = %p\n", p); //显示指针地址
getchar();
}
image.png
int sprintf(char *str, const char *format...)发送格式化输出到str所指向的字符串。
返回值:如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
void main()
{
char str[888];
sprintf(str, "Life is always tough.\n");
printf(str);
getchar();
}
image.png
int vfprintf(FILE *stream, const char *format, va_list arg)使用参数列表发送格式化输出流到流stream中。
stream--这是指向FILE对象的指针,该FILE对象标识了流。
返回值:如果成功,则返回写入的总字数,否则返回一个负数。
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
int nLen;
int write(FILE *stream, char *format,...)
{
va_list args;
va_start(args, format);
nLen = vfprintf(stream, format, args);
va_end(args);
return nLen;
}
void main()
{
FILE *fp;
fp = fopen("Jack.txt", "w+");
write(fp, "Hhhh, This is just one argument %d\n", 100);
fclose(fp);
printf("%d\n", nLen);
getchar();
}
image.png
int vprintf(const char *format, va_list arg)使用参数列表发送格式化输出到标准输出stdout.
返回值:如果成功,则返回写入的字符总数,否则返回一个负数。
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
int nLen;
int write(char *format,...)
{
va_list args;
va_start(args, format);
nLen = vprintf(format, args);
va_end(args);
return nLen;
}
void main()
{
write("Number 1\n");
printf("nLen = %d\n", nLen);
write("Number two.\n");
printf("nLen = %d\n", nLen);
getchar();
}
image.png
int vsprintf(char *str, const char *format, va_list arg)使用参数列表发送格式化输出到字符串。
返回值:如果成功,则返回写入的字符总数,否则返回一个负数。
int fscanf(FILE *stream, const char *format,...)从流stream读取格式化输入。
返回值:如果成功,该函数返回成功匹配的赋值的个数。如果到达文件末尾或发生读错误,则返回EOF。
void main()
{
char str1[20], str2[20], str3[20];
int nYear;
FILE *fp;
fp = fopen("Jack.txt", "w+");
fputs("Life is tough 2018", fp);
rewind(fp);
fscanf(fp, "%s %s %s %d", str1, str2, str3, &nYear);
printf("str2 = %s\n", str2);
printf("nYear = %d\n", nYear);
fclose(fp);
getchar();
}
image.png
int scanf(const char *format,...)从标准输入stdin读取格式化输入。
返回值:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF.
int sscanf(const char *str, const char *format,...)从字符串读取格式化输入。
返回值:如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回EOF.
void main()
{
char cSubject[10], cPredicate[10], cObject[10];
char str[100];
strcpy(str, "Life is tough.\n");
sscanf(str, "%s %s %s", cSubject, cPredicate, cObject);
printf(cSubject);
printf(cPredicate);
printf(cObject);
getchar();
}
image.png
int fgetc(FILE *stream)从指定的流stream获取下一个字符,并把位置标识符往前移动。
返回值:该函数以无符号char强制转换为int的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回EOF.
char *fgets(char *str, int n, FILE *stream)从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止。
int fputc(int char, FILE *stream)把参数char指定的字符写入到指定的流stream中,并把位置标识符往前移动。
返回值:如果成功,则返回被写入的字符。如果发生错误,则返回EOF,并设置错误标识符。
void main()
{
FILE *fp;
int nChar;
fp = fopen("Jack.txt", "w+");
for(nChar = 22; nChar <= 100; nChar++)
{
fputc(nChar, fp);
}
fclose(fp);
getchar();
}
image.png
int fputs(const char *str, FILE *stream)把字符串写入到指定的流中,但不包括控制符。
int getc(FILE *stream)从指定的流stream获取下一个字符,并把位置标识符往前移动。
int getchar(void)从标准输入stdin获取一个字符。
char *gets(char *str)从标准输入stdin读取一行,并把它存储在str所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止。
int putc(int char, FILE *stream)
把参数char指定的字符写入到指定的流stream中,并把位置标识符往前移动。
int putchar(int char)
把参数char指定的字符写入到标准输出stdout中
int puts(const chat *str)
把一个字符串写入到标准输出stdout,直到空字符,但不包括空字符。
int ungetc(int char, FILE *stream)把字符char推入到指定的流stream中,一边它是下一个被读取到的字符。
void perror(const char *str)把一个描述性错误信息输出到标准错误stderr.