注意:这里的输入输出是相对于程序而言的!
下述的函数是一些比较简单的输入输出文件中内容的函数
fgetc : 字符输入--输入到程序中
fputc : 字符输出--输出到文件中
fgets : 文本输入
fputs : 文本输出
fwrite: 以二进制形式输出(输出程序,写入文件)
fread : 以二进制形式输入(读取文件,写入程序)
下图是cpp操作的文件夹目录;
下面是一段实例,去一个个输入字符:
int main()
{
FILE* pf = fopen("GuessWhat.txt","w");
//使用指针接收fopen函数的返回值
//空文件读取时,返回的指针为空指针!
if (pf == NULL)
{
perror("fopen");//打开文件失败,报错
return 1;
}
//接下来开始写文件,就是把内存中的数据输出到文件中
//int fputc(int c, FILE* stream) 写一个字符,到数据流中
//这里的c是指字符!FILE*stream是文件
fputc('b', pf);
fputc('o', pf);
fputc('b', pf);
fclose(pf);
pf == NULL;//关闭文件
return 0;
}
然后运行它,就可以看到目录中的GuessWhat.txt出现:
这就说明,从程序中输出的数据,被输送到文件当中了。
下面还有几个实例,分别对应读、写字符串:
int main()
{
FILE* pf = fopen("test.dat", "r");//w进行文件的读取
if (pf == NULL)
{
perror("fopen");
return 1;
}
//int fgetc(FILE* stream)从文件流里()读取字符到程序中;其返回值是一个字符(ASCIIM值)
int ret = fgetc(pf);
printf("%c",ret);
ret = fgetc(pf);
printf("%c", ret);
ret = fgetc(pf);
printf("%c", ret);
ret = fgetc(pf);
printf("%c", ret);
fgetc读取一个字符之后,会自动指下一个字符!
//多次读取并打印
//但是如果读取多了,超过了文件本身的字符含量,那么读取值不确定,就会出现err
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
//int main()
//{
//
//
//
// FILE* pf = fopen("test.dat","w");
// if (pf == NULL)
// {
// perror("fopen");
// return 1;
// }
// //int fputs(string,pf)
// fputs("abcdef\n",pf);//写数据
// //想要换行,需要写换行符
// fputs("abcdef\n", pf);
//
//
// //char* fgets(char *string, int n, FILE* stream)
// // char* string是临时存放get到的数据,然后在n的判断下,输入到程序中,
// // FILE* stream是文件名称/数据流的名称
// //这里的n指的是读取的最多的数据个数
//
//
// char arr[20] = {0};//这里使用数据临时接收数据
// char *ret = fgets(arr, 4, pf);
// printf("%s",ret);
//
// int r = fclose(pf);
// pf == NULL;
//
//
// return 0;
//}
书写一段二进制输出到文件中的代码段:
然后ctrl + F5直接执行程序,然后就可以打开test.dat,打开后发现文件中结果如下:
下述代码段包含了fwrite函数的参数、返回值类型信息,以及其用法。
struct S
{
char arr[10];
int num;
float sc;
};
int main()
{
struct S s = { "abcdef", 10, 5.5f };
//二进制形式写
FILE* pf = fopen("test.dat", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
//(程序数据输出)——
//fwrite(); writes data to a stream;
//size_t fwrite(const void* buffer, size_t size, size_t cout, FILE*stream)
//这里的buffer指向要写入的数据
//这里的size指的是写入数据的字节大小(可以用int、struct之类的代替)
//cout指的是写入数据的份数
//FILE*stream指的是文件对应的流
fwrite(&s, sizeof(struct S), 1, pf);//将S数据写入文件,写入字节大小为struct S;写一份;流为指针pf
//关闭文件
fclose(pf);
pf == NULL;
return 0;
}
很明显,只有字符串能够正常显示;这是因为,字符串无论是以文本形式写入文件,还是以二进制形式写入,内容都是一样的。而整数、浮点型等的书写,文本形式与二进制形式信息不同。
而我打开test.dat用的是文本编译器,如果使用VS打开,就会出现二进制显示。
引入概念:流
流:高度抽象的概念
程序可以放在屏幕、硬盘、U盘、光盘、网络上
程序与上述的对象,中间有一个流的概念;程序输入到"流中",而"流"向外部设备输出数据
C语言程序只要运行起来,就默认打开了3个流:stdin__标准输入流-键盘;stdout__标准输出流-屏幕;stderr__标准错误流-屏幕
实例如下:
从标注输入流中读取——从键盘读取
int main()
{
int ret = fgetc(stdin);//直接从键盘中输入数据到程序当中
printf("%c", ret);
ret = fgetc(stdin);//直接从键盘中输入数据到程序当中
printf("%c", ret);
ret = fgetc(stdin);
printf("%c", ret);
ret = fgetc(stdin);
printf("%c", ret);
return 0;
}
上一张图片是在向程序中输入数据(即从文件中获取)
下面额stdout:标准输出流,就是直接通过流,来将数据从程序中输出到文件当中去。
当然,每次运行完fputc后,其将会自动右移;以便下个数据的输入。
fputc('f', stdout);
fputc('o', stdout);
fputc('o', stdout);
fputc('l', stdout);