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. Linux系统搭建Hadoop集群

    一.环境说明 IP地址 主机名 备注 操作系统 192.168.92.11 hserver1 namenode Ubuntu 16.04 192.168.92.12 hserver2 datanode ...

  2. App测试工具大全,收藏这篇就够了

    随着移动互联网的高速发展,App 应用非常火,测试工程师也会接触到各种 app 应用.除了人工测试之外,也可以通过一些测试工具来提高我们的测试效率,以下对于我用过或听过的 app 测试工具做了一个统一 ...

  3. kubelet拉取pause镜像报错pull access denied for 172.20.59.190:81/kubernetes/pause-amd64, repository does not exist or may require 'docker login': denied

    目录 1 背景说明 2 现象 pod无法启动,一直显示ContainerCreating 3 问题分析 kubelet的启动参数如下 4 尝试的解决方法 4.1 本地docker login登录镜像仓 ...

  4. Linux 系统编程 学习:09-线程:线程的创建、回收与取消

    Linux 系统编程 学习:09-线程:线程的创建.回收与取消 背景 我们在此之前完成了 有关进程的学习.从这一讲开始我们学习线程. 完全的开发可以参考:<多线程编程指南> 在Linux ...

  5. 【Kata Daily 190918】Spacify(插空)

    题目: Modify the spacify function so that it returns the given string with spaces insertedbetween each ...

  6. 激情的来源 Imagine how much you love it !

    激情来自哪里?我想可能我找到了,精髓就在那个标题! 想象你有多么爱它!你就会爱上他,想象你有多么喜欢某一个东西,你很有可能就喜欢上他,着手去了解他,接触他. 如果带着这种想象状态的激情,工作和学习会有 ...

  7. XCTF-crypto---转轮机加密

    转轮密码机是由一个输入键盘和一组转轮组成的,每个转轮上标有26个字母,字母的顺序随意,转轮之间由齿轮进行连接,当一个转轮转动时,可以讲一个字母转化为另一个字母. 工作原理: 转轮机由多个转轮构成,每个 ...

  8. tcp 客户端 synack的接收 以及 相互connect

    接收入口 tcp_v4_rcv    |--> tcp_v4_do_rcv               |-> tcp_rcv_state_process                  ...

  9. python之《matplotlib》

    # _*_coding:utf-8_*_# /usr/bin/env python3# Author:book Mikiimport matplotlib.pyplot as pltimport nu ...

  10. rgw前端替换civetweb为beast

    前言 ceph的rgw现在提供了两种前端, civetweb和beast 配置 修改配置文件 rgw_frontends = civetweb port=7481 为 rgw frontends = ...