fopen( ) 函数:创建一个新的文件或者打开一个已有的文件

FILE *fopen( const char * filename, const char * mode );

关于参数mode的取值

r
w 写(无文件则创建)(从头写)
a 写(无文件则创建)(追加)
r+ 读写
w+ 读写。如果文件存在,则截断为零长度,如果文件不存在,则创建一个新文件。
a+ 从头读,追加写(无文件则创建)

新建 从头 追加
r
w
a
r+
w+
a+

写文件示例

#include <stdio.h>

int fileWrite() {
FILE *fp = NULL; fp = fopen("test.txt", "a+");
if(NULL == fp) {
// 将文件设为"只读",可测此处代码
puts("fopen出错");
// 使用perror()显示错误信息
perror("fopen() Err");
return -1;
}
fprintf(fp, "云想衣裳花想容,春风拂槛露华浓。\n");
fputs("若非群玉山头见,会向瑶台月下逢。\n", fp); fclose(fp);
return 0;
}
main() {
fileWrite();
}

读文件示例

#include <stdio.h>

int  fileRead() {
FILE *fp = NULL;
char buff[255]; fp = fopen("test.txt", "r");
if(NULL == fp) {
perror("fopen Error");
return -1;
}
fscanf(fp, "%s", buff);
printf("读取到空白字符: %s\n", buff ); fgets(buff, 255, (FILE*)fp);
printf("读取一行: %s\n", buff ); fclose(fp);
return 0;
}
main() {
fileRead();
}

偏移

	fp = fopen(g_sFile, "r");
// int fseek(FILE *stream, long offset, int fromwhere);
// 第一个参数stream为文件指针
// 第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
// 第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
// SEEK_SET:文件开头(0)
// SEEK_CUR:当前位置(1)
// SEEK_END:文件结尾(2)
// 定位成功:返回0
// 定位失败:返回非0
fseek(fp,1,SEEK_CUR);

示例:修改指定人员的成绩记录

现有成绩文件: data.dat

Apple,100;
Banana,098;
Cat,060;
Dog,032;

修改Cat的成绩为59分,即[Cat,060;]→[Cat,059;]前后内容都不变

为了方便定位,约定成绩都是3位字符表示

SEEK_CUR版

偏移数值问题——Unix和Windows不同

Unix(不算LF):fseek(fp, -4, SEEK_CUR)

Windows(算CR LF):fseek(fp, -6, SEEK_CUR)

SEEK_SET版

即使使用SEEK_SET从头找,找到上一行尾,再加,也有区别:

Unix:fseek(fp, nCurLen+4, SEEK_SET);
WIndows:fseek(fp, nCurLen+6, SEEK_SET);

结论:CRLF在内存中是不同的,所以fseek的参数有差别;但是反映在字符串上,都是一个\n(ASCII 10),比如第一行,strlen都是11

参考代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int updateFile() {
int nRet = 0;
FILE * fp = NULL; fp = fopen("data.dat", "r+");// r+:读写
if (NULL == fp) {
perror("fopen() Err");
return 0;
}
// 读取文件
char buff[1024]= {0};
while(fgets(buff, 1024, fp)) {
// char *strstr(char *str1, const char *str2);
// 判断字符串str2是否是str1的子串。
// 是:返回str2在str1中首次出现的地址;
// 否:返回NULL
if(strstr(buff, "Cat") != NULL) {
//此时"光标"在读到的内容后面
int nSeek = fseek(fp, -6, SEEK_CUR);
if(nSeek != 0) {
perror("fseek");
break;
} else {
// 修改文件
fprintf(fp, "%s", "059");
nRet = 1;
break;
}
}
}
// 无果:关闭文件
fclose(fp);
return nRet;
}
int main(int argc, char *argv[]) {
updateFile(); return 0;
}

应用:读写log

#include <stdio.h>
#include <io.h>
#include <time.h>
#include <direct.h> enum Level { DEBUG, INFO, WARING, ERROR}; const char* g_sDir = "temp";
const char* g_sFile = "temp/info.txt"; void getTime(char* sTime_o) {
time_t _time;
time(&_time);
struct tm *p =localtime(&_time); // 格式化,并写入到字符串中
sprintf(sTime_o, "%d-%02d-%02d %02d:%02d:%02d",
p->tm_year+1900,
p->tm_mon + 1,
p->tm_mday,
p->tm_hour,
p->tm_min,
p->tm_sec);
}
int makeDir() {
// access:判断文件或文件夹是否存在
// <io.h>
// F_OK:判断是否存在
// success:0
// fault:-1
if (access(g_sDir, F_OK ) == 0) {
// 文件夹存在
} else {
// _mkdir:创建文件夹
// <direct.h>
// success:0
// fault:-1
if (_mkdir(g_sDir) == -1) {
printf("创建文件夹失败");
return -1;
} }
return 0;
}
int logWrite(Level lvl, char*msg) {
// 获取时间
char sTime_o[200];
getTime(sTime_o);
//-------------------------
// 创建log文件夹
if(makeDir() == -1) {
return -1;
}
// 打开文件
FILE *fp = NULL;
fp = fopen(g_sFile, "a+");
if(NULL == fp) {
printf("无法打开文件%s\n", g_sFile);
return -1;
}
// 根据log级别,写入log
if (lvl == DEBUG) {
fprintf(fp, "%s [DEBUG] %s\n",sTime_o,msg);
} else if(lvl == INFO) {
fprintf(fp, "%s [INFO] %s\n",sTime_o,msg);
}
fclose(fp);
return 0;
}
int logRead() {
FILE *fp = NULL;
fp = fopen(g_sFile, "r");
if(NULL == fp) {
puts("文件读取失败");
return -1;
} //TEST: 当前位置右移1
fseek(fp,1,SEEK_CUR); // 读取文件
char buff[255] = {0};
while(fgets(buff, 255, (FILE*)fp)!=NULL) {
printf("> %s", buff );
}
fclose(fp);
return 0;
}
main() {
// 能写,才读;不写,不读
if (logWrite(INFO,"郭德纲") == 0) {
logRead();
}
}

C语言讲义——文件操作的更多相关文章

  1. C语言程序设计--文件操作

    前言 这里尝试与Python对别的方法来学习C语言的文件操作,毕竟我是Pythoner. 文件打开与关闭 Python #因为是和C语言比对,所以不使用with filename = "/e ...

  2. C语言之文件操作08——总结

    C程序的文件操作共涵盖7个例题,包括格式打印,文件读取,条件查找,矩阵的文件操作,数据格式输入及调用计算等内容. 文件操作使得程序有更强的拓展性,使其能够单独保存数据.这为程序的调试和优化打下了坚实的 ...

  3. C语言之文件操作

    C语言之文件操作 在本节我们将会讲解有关文件的读写操作: 纲要: 一些需要掌握的知识点 文件名 文件类型 数据流 文件缓冲区 文件指针 与文件操作相关的一些函数 文件的打开及关闭 文件的顺序读写 文件 ...

  4. c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_

    1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...

  5. c语言,文件操作总结

    C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来 ...

  6. C语言的文件操作

    在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也被看成一个文件.对于这些文件的操作,等于是对普通文件的操作.例如,通常把显示器称为标准输出文件,printf就是想这个文件输出,把键盘 ...

  7. C#语言-07.文件操作

    a. 文件操作:适用于相对简单的数据保存 i. 读写文件的步骤: . 创建文件流 . 创建读写器 . 读写文件 . 关闭读写器 . 关闭文件流 ii. FileStream(文件流),它主要用于读写文 ...

  8. Linux下C语言的文件操作

    代码: #include <stdio.h> #include <string.h> #include <fcntl.h> /*************基本的函数A ...

  9. 超赞的 Go 语言 INI 文件操作

    灵活的数据源 不光光可以从文件读取配置,还支持 []byte 类型的纯数据读取和基于 io.ReadCloser 的流式读取. 多种格式兼容 各种文件种类的广泛支持,包括但不限于 my.cnf..gi ...

随机推荐

  1. js 小数点失精度

    解决方法思路:将小数化成整数后再作运算.具体代码如下:  /*** 加法运算,避免数据相加小数点后产生多位数和计算精度损失.** @param num1加数1 | num2加数2*/function ...

  2. D. Rescue Nibel! 解析(思維、組合、離散化、差分)

    Codeforce 1420 D. Rescue Nibel! 解析(思維.組合.離散化.差分) 今天我們來看看CF1420D 題目連結 題目 給你\(n\)個區間,求有幾種方法使得\(k\)個區間的 ...

  3. Jenkins部署分支报Finished: UNSTABLE的问题解决

    近期将代码分支部署到Jenkins上时报Finished: UNSTABLE,检查服务器无报错日志.怀疑是磁盘空间不足所致. 首先,在服务器上输入df -lh 查看本地磁盘使用情况,发现空间几乎被用完 ...

  4. C# NModbus RTU通信实现

    Modbus协议时应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络/串口和其它设备之间可以进行通信.它已经成为了一种工业标准.有了这个通信协议,不同的厂商生成的控制设备就可 ...

  5. python获取当前时间、今天零点、235959点、昨天当前时间、明天的当前时间

    python获取当前时间.今天零点.23:59:59点.昨天当前时间.明天的当前时间. 关注公众号"轻松学编程"了解更多. 获取当前时间.今天零点 使用timedalte. tim ...

  6. C++实现学校运动会管理系统

    本文实例为大家分享了C++实现学校运动会管理系统的具体代码,供大家参考,具体内容如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  7. CDM 设置 主键自增

    一些朋友在用PD建概念模型时,觉得主键无法设置自增,还需要在生成PDM后,单独再设置一次,很麻烦. 自增主键一般都是整形,int ,long 如果我们在CDM建实体模型时,将自增主键设置为Serial ...

  8. 内网渗透 day8-linux提权和后门植入

    linux提权和后门植入 目录 1. 脏牛漏洞复现 3 (1) 去网上把代码复制然后touch一个.c文件,vi或者vim打开将代码复制进去保存 3 (2) 进入shell然后从kali开的apach ...

  9. git clone克隆github仓库慢,问题解决

    导读 转载自:https://www.hangge.com/blog/cache/detail_2670.html 原因     由于国内网络问题,当我们使用 git clone 命令从 github ...

  10. GMP-C/C++(大数库)使用方法

    The GNU Multiple Precision Arithmetic Library(GNU 高精度算数库)是一个用于任意精度算术的免费库,可处理带符号整数,有理数和浮点数.除了运行GMP机器中 ...