文件:
文件的分类:
文本文件: 一打开就能看懂的文件
二进制文件:一打开是乱码的东西,或者说全是二进制数字的文件叫二进制文件。
文件流:就是将文件一段一段的加载,然后进行读取,比如看电视下面的加载栏
文件操作的步骤:
打开文件
操作文件
关闭文件
怎么用代码的方式打开文件?
fopen函数:
fopen(路径,操作方式)
路径:
绝对路径:文件的全路径
相对路径:相对于文件当前的路径
r: 只读,如果文件不存在,那就返回NULL
w: 只写,如果文件存在,则会覆盖原来的文件,如果不存在,则会创建。
a: 追加,如果文件存在,则会在后面追加原来的文本内容,如果文件不存在,则会创建。(不管存在,不存在最终都会返回文本指针)
r+: 只是在r的基础上增加了写的功能
w+: 只是在w的基础上增加了读的功能
a+: 只是在a的基础上增加了读的功能
t: 文本文件
b: 二进制文件
注意:在MAC或linux或UNIX下,文本文件和二进制文件是一样的
在windows下有区别,写入的是文本文件,会把所有的\n替换成\r\n,二进制文件不会替换。
2)几个函数的使用方法:
fgetc与fputc函数
fgetc函数:读取一个字符
fputc函数:写入一个字符
#include <stdio.h>
#include <string.h>
void writeTest(){
/* FILE *fp=fopen("/Users/huanglichao/Desktop/3.txt", "w");
if (fp !=NULL) {
char str[50]="hello";
unsigned long len=strlen(str);
for (int i=0; i<len; i++) {
fputc(str[i], fp); //用循环的方式写入字符,不用一个一个的写。
}
fclose(fp);
}
*/
}
int main(int argc, const char * argv[]) {
FILE *fp=fopen("/Users/huanglichao/Desktop/3.txt", "r");
if (fp !=NULL) {// NULL 就是 0 16进制0x0
// char str[50]={0};
// fgets(str, 3, fp); //这里的3 实际还要留一个空格给'\0',所以读取的是he。
// //用循环怎么读取呢
// 这是一个手动的读取部分
// printf("%s",str);
//
while(1){
char ch =fgetc(fp);
if (ch==EOF) { //EOF是结束符
break;
}
printf("%c",ch);
}
fclose(fp);
}
return 0;
}
3)fgets 和fputs的使用
fgets 和 fputs 函数
fgets :读取一个字符串
fputs: 输入一个字符串
#include <stdio.h>
int main(int argc, const char * argv[]) {
/*FILE *fp=fopen("/Users/huanglichao/Desktop/3.txt", "w");
if (fp) { //fp为真,则继续往下执行 仔细剖析 fp !=NULL
char str[50]="aksjfk";
fputs(str, fp);
printf("%s\n",str);
fclose(fp);
}
*/ //写入字符串
FILE *fp=fopen("/Users/huanglichao/Desktop/3.txt", "r");
if (fp) { //fp为真,则继续往下执行 仔细剖析 fp !=NULL
// char str[50]={0};
// fgets(str,4, fp);//这里的4,实际得到是3,要留一个位置给'\0'。
//
// printf("%s\n",str);
// 怎么用循环的方式读取字符串 返回0 代表字符串还未到末尾
//这里feof(fp) 返回1 代表字符串到末尾
while(1){
if (feof(fp)) {
break;
}
char str[50];//这里的字符串每次都会被覆盖,可以用断点查看。
fgets(str, 10, fp);
printf("%s",str);
}
fclose(fp);
}
return 0;
}
fprintf (变量指针,"格式控制符",参数列表)
fscanf(变量指针,"格式控制符",地址列表)
#include <stdio.h>
void testFprintf(){
FILE * fp = fopen("/Users/ios001/Desktop/1.txt", "w");
if (fp) {
fprintf(fp, "%d",99);
fclose(fp);
}
}
int main(int argc, const char * argv[]) {
fprintf(stdout, "哈哈哈哈哈\n"); //跟printf没差别,stdout代表在控制台输出
int num;
fscanf(stdin, "%d",&num); //stdin在控制台输入
printf("num=%d\n",num);
/*
FILE * fp = fopen("/Users/ios001/Desktop/1.txt", "r");
if (fp) {
// int num;
// char ch;
// fscanf(fp, "%c帅%d",&ch,&num);
//
// printf("ch=%c num=%d\n",ch,num);//a 99
char str[50] = {0};
char str2[50];
fscanf(fp, "%s\n%s",str,str2);
puts(str);
puts(str2);
fclose(fp);
}
*/
return 0;
}
5)fread 和write函数的使用:
// fread和fwrite函数
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
// FILE *fp =fopen("/Users/huanglichao/Desktop/3.txt", "r");
// if (fp) {
// char str[50]={0};
// fread(str, 1, 100, fp); 它只关心具体读的字节数,不会关心这些自己里面有没有换行
// printf("%s",str);
// 读
FILE *fp =fopen("/Users/huanglichao/Desktop/3.txt", "w");
if (fp) {
char str[50]="你妈的就阿卡哈";
unsigned long len=strlen(str);
fwrite(str,1 , len, fp);//最好不要写太大,因为有垃圾值在其中,文件就打不开了
printf("oubasang\n");
fclose(fp);
}
return 0;
}