c语言文件操作 您所在的位置:网站首页 c语言里puts c语言文件操作

c语言文件操作

2022-12-24 00:03| 来源: 网络整理| 查看: 265

c语言文件操作 认识文件

文件结束标记 EOF

#include int main() { //注意点:c语言文件名后缀没有关系 //怎么写怎么都即可 //如:FILE* fp = fopen("1.st", "w"); ​ FILE* fp = fopen("1.txt", "w");  //没有写./之类表示的当前路径 //关掉SDL检查 //防御性编程,判断是否成功 if (fp == NULL) { printf("文件打开失败"); return 0; } /*     读写方式: r:read     不带创建 w:write   具有创建+清空(存在文件) a:append   追加写方式 ​ + 可读可写 r+       不带创建 w+       具有创建+清空(存在文件) a+       追加写方式 ​ b:binary 二进制 ​ */ ​ fclose(fp); return 0; } 文件的读写

注意点:所有的文件操作不需要大家操作指针

字符的读写:fputc+fgetc 字符串的读写:fputs+fgets 格式化读写:fprintf+fscanf 二进制读写:fwrite+fread

字符读写

#include ​ //把字符写入文件 void WriteCharToFle() { // No.1 打开写好 FILE* fp = fopen("char.txt", "w"); if (fp == NULL) { printf("文件打开失败\n"); return; } ​ char buffer[] = { "ILOVEYOU,我喜欢你" }; int i = 0; while (buffer[i] != '\0') { fputc(buffer[i], fp);  //写 i++; } // No.2 关闭写好 fclose(fp); return 0; } //读取字符 void ReadFileByChar() { FILE* fp = fopen("char.txt", "r");   //不要用w+的方式去读文件,w的方式具有清空的功能 if (fp == NULL) { printf("文件打开失败\n"); return; } //文件结束标志 EOF,其实就是-1 int userKey = fgetc(fp); while (userKey!=EOF) { putchar(userKey); userKey = fgetc(fp); } ​ fclose(fp); } ​ ​ int main() { //WriteCharToFle(); //ReadFileByChar(); ​ return 0; }

字符串的读写

#include ​ //把字符串写入文件 void WriteStringToFile() { FILE* fp = fopen("String.txt", "w"); if (fp == NULL) { printf("打开文件失败\n"); return; } char buffer[] = { "ILOVEYOU,我喜欢你" }; fputs(buffer, fp); fclose(fp); } //文件中读取字符串 void ReadFileByString() { FILE* fp = fopen("String.txt", "r"); if (fp == NULL) { printf("打开文件失败\n"); return; } // 问题是不知道准备一个多大的字符 char buffer[1024]={" "};//注意要初始化 char* result=fgets(buffer, 1024,fp); while (result!=NULL) { printf("%s", result); result = fgets(buffer, 1024, fp); } puts(buffer); fclose(fp); } int main() { WriteStringToFile(); ReadFileByString(); return 0; } 格式化读写数组 #include ​ //No.1 数据需要表格特性存储到文件,考虑使用格式化读写 void test() { //fprintf //fscanf fprintf(stdout, "%s\t%d\n", "MM", 20); int age; int result = fscanf(stdin, "%d", &age); printf("%d", age); } ​ struct MM { char name[20]; int age; int num; }; //写入文件 void SaveFile() { struct MM mm = { "mm",18,1001 }; FILE* fp = fopen("format.txt", "w"); if (fp == NULL) { printf("文件打开失败\n"); return; } fprintf(fp, "%s\t%d\t%d\n", mm.name, mm.age, mm.num); fprintf(fp, "%s\t%d\t%d\n", mm.name, mm.age, mm.num); fprintf(fp, "%s\t%d\t%d\n", mm.name, mm.age, mm.num); fprintf(fp, "%s\t%d\t%d\n", mm.name, mm.age, mm.num);//打印到文件里面 fclose(fp); } //读取文件 void ReadFile() { struct MM mm; FILE* fp = fopen("format.txt", "r"); if (fp == NULL) { printf("文件打开失败\n"); return; } //通过fscanf返回值判定 //注意点:文件读操作,支持转义字符,但是没有精度控制   //比如:fscanf(fp, "%s\t%d\t%2.f\n", mm.name, &mm.age, &mm.num) != EOF while (fscanf(fp, "%s\t%d\t%d\n", mm.name, &mm.age, &mm.num) != EOF) { printf("%s\t%d\t%d\n", mm.name, mm.age, mm.num); } ​ } ​ int main1() { //test(); //SaveFile(); ReadFile(); return 0; } 链表文件操作 void writeToFile(Node* list) { FILE* fp = fopen("student.txt", "w"); if (fp == NULL) { printf("文件打开失败"); return; } Node* p = list->next; while (p != NULL) { fprintf(fp,"%s\t%s\t%d\t%s\n", p->id, p->name, p->age, p->ban); p = p->next; } fclose(fp); } void readFile(Node* list) { FILE* fp = fopen("student.txt", "r"); if (fp == NULL) { FILE* fp = fopen("student.txt", "w+"); fclose(fp); return; } student stu; while (fscanf(fp,"%s\t%s\t%d\t%s\n", stu.id, stu.name, &stu.age, stu.ban) != EOF) { //printf("%s\t%s\t%d\t%s\n", stu.id, stu.name, stu.age, stu.ban); insertStudent(list,stu); } fclose(fp); } 二进制写文件

注意:二进制写法,读写方式的b不要缺少(通常用来写结构体的)

#include ​ struct MM { char name[20]; int age; int num; }; ​ void SaveFile() { FILE* fp = fopen("binary", "wb");//二级制读写b一定不能少 struct MM array[3] = { "mm",18,1,"girl",19,2,"beauty",20,3 }; //for (int i = 0; i < 3; i++) //{ // fwrite(&array[i], sizeof(struct MM), 1, fp); //} //上面循环代码等效于下面一行代码 fwrite(array, sizeof(struct MM), 3, fp); fclose(fp); } ​ void ReadFile() { FILE* fp = fopen("binary", "rb"); //如果知道具体的结构体数组的个数,可以这样子 //struct MM temp[3]; //fread(temp, sizeof(struct MM), 3, fp); //for (int i = 0; i < 3; i++) //{ // printf("%s\t%d\t%d\n", temp[i].name, temp[i].age, temp[i].num); //} //如果不知道 struct MM mm; while (fread(&mm,sizeof(struct MM),1,fp)!=0) { printf("%s\t%d\t%d\n", mm.name, mm.age, mm.age); } ​ fclose(fp); } int main() { SaveFile(); ReadFile(); return 0; } 文件指针 重置开头-------rewind 参照定位-------fseek 统计移动-------ftell 判断是否末尾------feof rewind void test() { FILE* fp = fopen("test.txt", "w+"); fputs("ILOVEYOU", fp);           //写完,文件指针在文件末尾 char buffer[1024] = { " " }; //puts(fgets(buffer, 1024, fp)); //读不出内容 rewind(fp);                    //把文件指针移动到文件开始的位置 puts(fgets(buffer, 1024, fp)); fclose(fp); } fseek /* int __cdecl fseek(        FILE* _Stream,             //文件指针        _In_   long _Offset,     //相对开始,移动字节数:正数-->往前,负数-->往后        _In_   int   _Origin);   //参照点 参照点有三个: SEEK_CUR   当前位置     1 SEEK_END   结束位置     2 SEEK_SET   开始的位置   0 */ ​ void test() { FILE* fp = fopen("test.txt", "w+"); fputs("ILOVEYOU", fp);           //写完,文件指针在文件末尾 char buffer[1024] = { " " }; //puts(fgets(buffer, 1024, fp)); //读不出内容 //rewind(fp);                   //把文件指针移动到文件开始的位置 fseek(fp, 0L, SEEK_SET);         //把文件指针移动到文件开始的位置 //如果移动一个字节:fseek(fp, 1L, SEEK_SET);   puts(fgets(buffer, 1024, fp)); fclose(fp); } ftell(测定文件大小)

常用的辅助功能

得到操作文件的大小

//long __cdecl ftell(FILE * _Stream); long getFileSize(const char* filename) {    FILE* fp=fopen(filename,"r");    if(fp==NULL)        return 0;    fseek(fp,0L,SEEK_END);    long size=ftell(fp);    fclose(fp);    return size; } int main() {    printf("size:%ld\n",getFileSize("......"));    return 0; } feof 文件重定向

输出重定向

#include int main() { //No.1 输出重定向 FILE* fp = freopen("print.txt", "w", stdout);   //把原来该打印在控制台的效果放在文件里面去了 if (fp == NULL) { return 0; } printf("ILOVEYOU!\n"); puts("我爱你个der"); ​ //下面内容不想在文件完成 fp = freopen("CON", "w", stdout);     //定向回来 puts("hello"); fclose(fp); return 0; }

输入重定向

#include int main() { //No.2 输入重定向 FILE* fp = freopen("input.txt", "r", stdin); printf("定向输入:\n"); int a = 0, b = 0; scanf_s("%d%d", &a, &b); printf("sum:%d\n", a + b); return 0; }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有