C语言基础(十一)- 文件和目录操作运算

KinglyJn      2013-02-26

C\C++关于FILE结构定义说明

//此结构VC定义于stdio.h头文件中,
struct _iobuf { 
     char   *_ptr;      //文件输入的下一个位置 
     int    _cnt;       //当前缓冲区的相对位置 
     char   *_base;     //指基础位置(应该是文件的其始位置) 
     int    _flag;      //文件标志 
     int    _file;      //文件的有效性验证 
     int    _charbuf;   //检查缓冲区状况,如果无缓冲区则不读取 
     int    _bufsiz;    //文件的大小 
     char   *_tmpfname; //临时文件名 
};
typedef   struct   _iobuf   FILE; 


文件的打开、关闭、以及简单读写


# include <stdio.h>
# include <stdlib.h>

int main() {
	FILE * open_file(char *, char *);
	FILE *fp;

	/*
	 * 向文件中写入字符
	 * fputc 写入成功返回写入的字符,写入失败返回C语言定义的EOF(符号常量,值为-1)
	 */
	fp = open_file("C:/Users/kinglyjn/Desktop/test.txt", "a+"); //打开文件
	char c = getchar();
	while (c!='*') {
		fputc(c, fp);  //
		c = getchar(); //从控制台取到一个字符
	}
	fclose(fp); //关闭文件
 

	/**
	* 从文件中读出字符(文件的打开方式必须为读方式或读写方式)
	* 文件结束时,fgetc函数就会返回文件的结束标志EOF(-1)
	*/
	fp = open_file("C:/Users/kinglyjn/Desktop/test.txt", "r");
	c = fgetc(fp);
	while (c!=EOF) {
		putchar(c); //输出一个字符到控制台
		c = fgetc(fp); //
	}
	fclose(fp);

	return 0;
}

//文件打开函数
FILE * open_file(char * filename, char * mode) {
	FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
	if (fp==NULL) {
		printf("打开失败!\n");
		exit(1);
	} else {
		printf("打开成功!\n");
	}
	return fp;
}

/*
r  打开只读文件,该文件必须存在
r+ 打开可读写的文件,该文件必须存在
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失.若文件不存在则建立该文件
a 以附加的方式打开只写文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留
a+ 以附加方式打开可读写的文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件
*/


块读写函数fwrite和fread

# include <stdio.h>
# include <stdlib.h>

typedef struct Student {
    char name[10];
    float score;
} Stu;

int main() {
    FILE * open_file(char *, char *);
    FILE *fp;
    Stu stus[3] = { {"张三", 22.2}, {"李四", 33.3}, {"王五", 44.4} };
    Stu stus2[3];
    int len = 3;
    
    //fwrite
    //fwrite(buffer,size,count,fp)
    //(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
    //(2)size:要读写的字节数;
    //(3)count:要进行读写多少个size字节的数据项;
    //(4)fp:文件型指针。
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "w");
    for (int i=0; i<len; i++) {
        fwrite(&stus[i], sizeof(Stu), 1, fp); //
    }
    fclose(fp);
    
    //fread
    //fread(buffer,size,count,fp)
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "r");
    for (int i=0; i<len; i++) {
        fread(&stus2[i], sizeof(Stu), 1, fp);
    }
    fclose(fp);
    
    for (int i=0; i<len; i++) {
        printf("%-10s %-5.2f\n", stus2[i].name, stus2[i].score);
    }
    
    return 0;
}

//文件打开函数
FILE * open_file(char * filename, char * mode) {
    FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
    if (fp==NULL) {
        printf("打开失败!\n");
        exit(1);
    } else {
        printf("打开成功!\n");
    }
    return fp;
}


格式化文件输入和输出函数fprintf和fscanf

  • printf/scanf函数的读写对象是终端
  • fprintf/fscanf函数的读写对象是磁盘文件
# include <stdio.h>
# include <stdlib.h>

typedef struct {
    char name[10];
    float score;
} St;

int main() {
    FILE * fp;
    FILE * open_file(char * filename, char * mode);
    
    
    //fprintf
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "w");
    fprintf(fp, "%s %f", "张三", 23.2);
    fprintf(fp, "%s %f", "李四", 23.3);
    fprintf(fp, "%s %f", "王五", 23.4);
    fclose(fp);
    
    //fscanf
    St *stus = (St *) malloc(sizeof(St)*3);
    fp = open_file("/Users/zhangqingli/Desktop/test.txt", "r");
    int i=0;
    while (!feof(fp)) {
        fscanf(fp, "%s %f", stus[i].name, &stus[i].score);
        i++;
    }
    fclose(fp);
    
    for (int i=0; i<3; i++) {
        printf("姓名:%s  分数:%f\n", stus[i].name, stus[i].score);
    }
    
    return 0;
}

//文件打开函数
FILE * open_file(char * filename, char * mode) {
    FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
    if (fp==NULL) {
        printf("打开失败!\n");
        exit(1);
    } else {
        printf("打开成功!\n");
    }
    return fp;
}

文件的定位

# include <stdio.h>
# include <stdlib.h>

int main() {
    FILE *fp1;
    FILE * open_file(const char *, const char *);
    
    fp1 = open_file("/Users/zhangqingli/Desktop/test.txt", "rb");
    
    //把文件的位置指针移动到文件尾
    fseek(fp1, 0, SEEK_END);
    
    //获取文件当前指针的位置
    long len = ftell(fp1); //根据前面的操作可获取文件的长度
    printf("文件的大小为:%ld 字节\b", len);
    
    return 0;
}

FILE * open_file(const char * filename, const char * mode) {
    FILE *fp = fopen(filename, mode);

    if (fp==NULL) {
        printf("文件打开时出错!\n");
        exit(1);
    }
    
    return fp;
}



Tags:


Share: