C - 基础 - 文件输入、输出
文本视图和二进制视图
二进制视图:文件每个字节都可以访问。 文本视图:文本+格式字符
fopen(file_path,mode)函数
模式:
- "r" : 只读
- "w" : 覆写,不存在则创建
- "a" : 追加,不存在则创建
- "r+" : 可读写
- "w+" : 可读写,若存在则覆写,不存在则创建
- "a+" : 可读写,若存在则追加,不存在则创建
示例:文件压缩程序
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 50 // 摘要程序,3个字符取1个 int main(int argc, char *argv[]) { FILE *in , *out; char name[LEN] = "/share/PostLoanData/file.txt"; // 源文件 char target[LEN]; // 目标文件 int ch; int count = 0; // 打开文件 if ((in = fopen(name, "r")) == NULL) { fprintf(stderr, "open file \" %s \" fail \n ", name); exit(2); } // 获得目标文件名 strcpy(target, name); strcpy(target + strlen(name) - 4, ".red"); printf("压缩文件名: %s \n", target); // 打开目标文件 if ((out = fopen(target, "w")) == NULL) { fprintf(stderr, "open file \" %s \" fail \n ", target); exit(3); } // 写入文件 while ((ch = getc(in)) != EOF) { if (count++ % 3 == 0) { putc(ch, out); } } // 关闭流 if (fclose(in) != 0 || fclose(out) !=0 ) { fprintf(stderr, "error in closing \n"); } puts("Done .\n"); return 0; }
fprintf()文件输入 、 fscanf() 文件输出
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN 50 // 摘要程序,3个字符取1个 int main(int argc, char *argv[]) { FILE *fp; char name[LEN] = "/share/PostLoanData/file.txt"; // 源文件 char words[LEN]; if ((fp = fopen(name, "a+")) == NULL) { fprintf(stdout, "Can't open file \" %s \" ", name); exit(1); } puts("向文件输入:\n"); while (gets(words) != NULL && words[0] != '\0') fprintf(fp, "%s", words); // 写入文件 puts("打印文件内容:\n"); rewind(fp); // 回到文件开始处 while (fscanf(fp, "%s", words) == 1) //读取文件 puts(words); if (fclose(fp) != 0)fprintf(stderr, "Error closing file \n"); puts("Done .\n"); return 0; }
fgets(buf,MAX,fp)读取、fputs(buf,fp)输入
fgets()
函数可以防止存储溢出,与fputs()
一起使用
#include <stdio.h> #define MAX 50 // 输入输出 int main(int argc, char *argv[]) { char line[MAX]; while ((fgets(line, MAX, stdin)) != NULL && line[0] != '\n') fputs(line, stdout); return 0; }
随机存取 fseek() 、 ftell()
fseek(fp,index,mode)
[文件指针,偏移量,模式]在打开文件中直接移动到任意字节处。移动成功返回0,否则-1。 ftell(fp)
返回long类型文件当前位置。
示例,逆序显示文件
#include <stdio.h> #include <stdlib.h> #define SLEN 50 #define CNTL_Z '\032' // 反序显示文件 int main(int argc, char *argv[]) { FILE *fp; char name[SLEN] = "/share/PostLoanData/file.txt"; // 源文件 char ch; long count, last; if ((fp = fopen(name, "rb")) == NULL) { printf("open fail %s\n", name); exit(1); } fseek(fp, 0L, SEEK_END); // 定位到文件结尾处 last = ftell(fp); for (count = 1L; count <= last; count++) { fseek(fp, -count, SEEK_END); // 回退读取位置 ch = getc(fp); if (ch != CNTL_Z && ch != '\r') putchar(ch); if (ch == '\r') putchar('\n'); } fclose(fp); return 0; }
大文件随机读取 fgetpos() 、 gsetpost() 函数
int fgetpos(FILE * restrict stream , fpos_t * restrict pos);
: 调用时在pos位置放置一个fpos_t值,这个值描述文件中一个位置,成功返回0;
int fsetpos(FILE * stream , const fpost_t *pos);
: 调用时,函数使用pos指向的位置上fpos_t
值设定文件指针指向该值所示位置,成功返回0。这个fpos_t
值应该是通过fgetpos()
函数获取。
其他标准I/O函数
int ungetc(int c , FILE *fp) // 将c指定的字符放回输入流。 int fflush(FILE *fp) // 刷新缓冲区 int setvbuf(FILE * restrict fp , char * restrict buf , int mode ,size_t sie) // 建立供标准I/O替换的缓冲区
二进制 I/O fread() 、 fwrite()函数
/** 将二进制数据写入文件 size_t是sizeof运算符返回类型, ptr为要写入的数据块地址,不确定类型 size表示要写入的数据块大小(字节单位) nmemb 数据块数目。 fp 要写入的文件 返回成写入的项目数,正常情况与nmemb相等 **/ size_t fwrite(const void * restrict ptr , size_t size , size_t nmemb , FILE * restrict fp); // 将 256字节大小数据对象写入文件 double buffer[10]; fwrite(buffer,sizeof(double),10,fp); /** 读取文件 size_t是sizeof运算符返回类型, ptr 读入文件数据的内存存储地址 size表示要写入的数据块大小(字节单位) nmemb 数据块数目。 fp 要读取的文件 返回成写入的项目数,正常情况与nmemb相等 **/ size_t fread(void * restrict ptr , size_t size , size_t nmemb , FILE * restrict fp); // 从文件读取到缓冲区 double buffer[10]; fread(buffer,sizeof(double),10,fp); int feof(FILE *fp) ; //读取到结尾返回非零值 int ferror(FILE *fp) ; //读写错误返回非零值
示例: 将文件追加到另一个文件
#include <stdio.h> #include <stdlib.h> #define SLEN 50 #define BUFSIZE 1024 void appen(FILE *source, FILE *dest); // 将文件追加到另一个文件 int main(int argc, char *argv[]) { FILE *fp , *ft; char source[SLEN] = "/share/PostLoanData/file.txt"; // 源文件 char targe[SLEN] = "/share/PostLoanData/file2.txt"; // 源文件 char ch; long count, last; if ((fp = fopen(source, "r")) == NULL) { printf("open source fail %s\n", source); exit(1); } if ((ft = fopen(targe, "a")) == NULL) { printf("open targe fail %s\n", targe); exit(2); } if (setvbuf(fp, NULL, _IOFBF, BUFSIZE) != 0) // 替代默认缓冲区 { fputs("Can't create input buffer\n", stderr); } appen(fp, ft); if (ferror(fp) != 0) fprintf(stderr, "Error in read file %s \n", source); if (ferror(ft) != 0) fprintf(stderr, "Error in read file %s \n", targe); fclose(fp); fclose(ft); return 0; } void appen(FILE * source, FILE * dest) { size_t bytes; static char temp[BUFSIZE]; // 分配一次 while ((bytes = fread(temp, sizeof(char), BUFSIZE, source)) > 0) // 读取到缓冲区 fwrite(temp, sizeof(char), bytes, dest); // 从缓冲区写入文件 }
相关推荐
qifei 2013-01-09
GerwelsJI 2019-12-28
qscool 2019-12-01
Chiclaim 2019-06-30
wanff0 2012-07-06
nogi 2018-11-04
AnotherSpace 2014-06-16
Usper 2011-01-23
write;//若fd为0,或这里直接写0,则会输出到屏幕上而不写入文件中。int w_size=write;//相当于复制了所输入文件.txt中的255个大小的字符串到新文件file-rw.txt中
上方科技技术交流 2011-01-01
zzpdljd 2014-01-04