通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误,但是使用不够方便。
函数原型:void perror(const char *s);
perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。
在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。
eg:
#include
#include
#include
#include
#include
int main()
{
int *p = malloc(INT_MAX);
if (p == NULL)
{
perror("use malloc");
//exit(EXIT_FAILURE);//结束程序
//atexit
}
//访问
free(p);
p = NULL;
system("pause");
return 0;
}
在上面代码中,如果内存分配出错,应该退出函数,这就用到了exit函数,它用于终止一个程序的执行,这个函数定义在stdlib.h中,原型如下:
void exit(int status);
参数status返回给操作系统,用于提示程序是否正常完成。
C语言定义了预定义符号:
EXIT_SUCCESS表示成功返回
EXIT_FAILURE表示失败返回
ANSI C规定就C程序而言,所有的I/O操作就是简单的从程序移进移出字节的事情,因此这种字节流被称为流。这样程序员就只要关注创建正确的输出字节数据,已经正确的解释从输入读取的字节。
绝大 多数的流都是完全缓冲,这就意味着“读取”和“写入”都是在一块被称为:缓冲区的内存区来回复制数据,从内存中来回复数据是特别快的。用于输出流的缓冲区只有被写满的时候才会被刷新(ffush,物理写入)到设备或者文件。一次性把放满的缓冲区数据写入和遂片把程序产生的数据写入相比效率更高。
分为两种文本流和二进制流
在stdio.h定义一个FILE结构
它和磁盘上的文件不一样。FILE
是一个数据结构,用于访问一个流。如果你激活几个流,每个流都会对应一个FILE结构。
为了操作流程,你调用一些合适的函数,并向函数传递一个与这个流相关的FILE参数。
对于每一个ANSI C程序而言,至少打开三个流:标准输入(stdin),标准输出(stout),标准错误(stderr)他们都是一个指向FILE结构的指针。
通常:
EOF-文件结束标志,表示文件到了结尾
FOPE_MAX-一个程序最多打开文件数(20)
FILENME _MAX-文件名的最大长度(260)
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
//写操作
fputc('b', pf);
fclose(pf);
pf = NULL;
}
int main()
{
//读操作
int ch = 0;
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
ch=fgetc(pf);
fputc(ch, stdout);
pf = NULL;
system("pause");
return 0;
}
eg:
int main()
{
int ch = 0;
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
fputs("bit\n", pf);
fputs("hehe\n", pf);
fclose(pf);
pf = NULL;
system("pause");
return 0;
}
eg:
int main()
{
int ch = 0;
char arr[10];
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
fgets(arr,10,pf);
printf("%s", arr);
fgets(arr, 10, pf);
printf("%s", arr);
fclose(pf);
pf = NULL;
system("pause");
return 0;
}
eg:
文件中写入
int main()
{
char arr[10] = { 0 };
int age = 0;
char ch = 0;
FILE* pf = fopen("text.txt", "w");
fscanf(stdin, "%s %d %c", arr, &age, &ch);
fprintf(pf, "%s %d %c", arr, age, ch);
fclose(pf);
pf = NULL;
system("pause");
return 0;
}
文件中读取
int main()
{
char arr[10] = { 0 };
int age = 0;
char ch = 0;
FILE* pf = fopen("text.txt", "r");
fscanf(pf,"%s %d %c", arr, &age, &ch);
fprintf(stdout, "%s %d %c", arr, age, ch);
fclose(pf);
pf = NULL;
system("pause");
return 0;
}
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S stu = { "zhangsan", 20, 120.0f };
char buf[100];
sprintf(buf, "%s %d %f", stu.name, stu.age, stu.score);
printf("%s", buf);
system("pause");
return 0;
}
int main()
{
struct S stu = { "zhangsan", 20, 120.0f };
struct S tmp = { 0 };
char buf[100];
sprintf(buf, "%s %d %f", stu.name, stu.age, stu.score);
sscanf(buf,"%s %d %f",tmp.name,&(tmp.age),&(tmp.score));
printf("%s %d %f", tmp.name, tmp.age, tmp.score);
system("pause");
return 0;
}
int main(int argc,char*argv[],char*envp)
{
FILE* pfRead = NULL;
FILE* pfWrite = NULL;
int ch = 0;
if (argc != 3)
{
printf("参数个数有误,必须是三个参数(例如test.exe test,txt test.txt.bak)");
exit(EXIT_FAILURE);
}
pfRead = fopen(argv[1], "r");
if (pfRead == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
pfWrite = fopen(argv[2], "w");
if (pfWrite == NULL)
{
perror("open file for write");
fclose(pfRead);
exit(EXIT_FAILURE);
}
while (EOF != (ch=fgetc(pfRead)))
{
fputc(ch, pfWrite);
}
fclose(pfRead);
pfRead = NULL;
fclose(pfWrite);
pfWrite = NULL;
system("pause");
return 0;
}
写进文件
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S stu = { "zangsan", 20, 120.0f };
FILE* pf = fopen("test.txt", "w");
fwrite(&stu,sizeof(struct S),1,pf );
fclose(pf);
pf = NULL;
system("pause");
return 0;
}
从文件读出
int main()
{
struct S stu = { 0 };
FILE* pf = fopen("test.txt", "r");
fread(&stu, sizeof(struct S), 1, pf);
printf("%s %d %f\n", stu.name, stu.age, stu.score);
fclose(pf);
pf = NULL;
system("pause");
return 0;
}