c语言文件基础知识

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

/*
* EOF: 符号常量,其值为-1.
* fgets() 最多读取int-1个字符,遇换行或EOF即返回.
* fputs() 写文件时,忽略字符串截止符‘\0‘.
* fread()和fwrite() 数据块读写,多用于结构体数组(顺序存储的结构体).
*
* 函数原型:
* 读:
* int fgetc(FILE *stream);
* char *fgets(char *s, int size, FILE *stream);
* size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
* int fscanf(FILE *stream, const char *format, ...);
* 写:
* int fputc(int c, FILE *stream);
* int fputs(const char *s, FILE *stream);
* size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
* int fprintf(FILE *stream, const char *format, ...);
* 其他:
* void rewind(FILE *stream); 将文件内部的位置指针重新指向一个流(数据流/文件)的开头.
*
* 打开方式:
* r(read): 读
* w(write): 写
* a(append): 追加
* +: 读和写
* t(text): 文本文件,可省略不写
* b(banary): 二进制文件
*/

FILE *fp = NULL;

// READ
void GetCharFromFile(FILE *fp)
{
int ch = 0;

while ((ch=fgetc(fp)) != EOF) //失败时返回 EOF
{
printf("fget: [%c]\n", ch);
}
}

void GetLineFromFile(FILE *fp)
{
char line[1024] = "";

while (fgets(line, sizeof(line), fp) != NULL) //失败时返回 NULL
{
printf("fgets: [%s]\n", line);
}
}

void GetBlockFromFile(FILE *fp)
{
int i = 0;
int block[10] = {0};
int count = 1;

while (fread(block, sizeof(block), count, fp) == count) //失败时返回值 != count
{
printf("fread: ");
for (i=0; i<10; i++)
{
printf("%d ", block[i]);
}
printf("\n");
}
}

void ReadFormatToFile(FILE *fp)
{
char file[32] = "";
char func[32] = "";
char date[32] = "";
int line = 0;

fscanf(fp, "%s %s %d %[^\n]", file, func, &line, date); //返回读取元素个数,eg:4
printf("file: %s\n", file);
printf("func: %s\n", func);
printf("line: %d\n", line);
printf("date: %s\n", date);
}

// WRITE
int WriteCharToFile(FILE *fp, char ch)
{
int ret = 0;

ret = fputc(ch,fp); //失败时返回EOF
return ret!=EOF?0:-1;
}

int WriteStrToFile(FILE *fp, char *str)
{
int ret = 0;

ret = fputs(str, fp);
return ret!=EOF?0:-1; //失败时返回EOF
}

int WriteBlockToFile(FILE *fp, const void *block, int size, int count)
{
int ret = 0;

ret = fwrite(block, size, count, fp); //失败时返回值 != count
return ret!=count?-1:0;
}

int WriteFormatToFile(FILE *fp)
{
int ret = 0;

ret = fprintf(fp, "%s %s %d %s\n", __FILE__, __func__, __LINE__, __DATE__);
return ret<0?-1:0; //失败时返回一个负值
}

// MAIN
int main(int argc, char **argv)
{
char ch = ‘r‘;
char *str = "Hello World.\n";
int block[10] = {1,2,3,4,5,6,7,8,9,0};
char *filePath = "./ll";

fp = fopen(filePath, "w+"); //不关心文件存在与否,每次重写文件,并可读
if (NULL == fp)
{
perror("fopen");
return -1;
}

// WRITE
// printf("WriteCharToFile: %s\n", WriteCharToFile(fp, ch)?"Fail":"Success");
printf("WriteStrToFile: %s\n", WriteStrToFile(fp, str)?"Fail":"Success");
// printf("WriteBlockToFile: %s\n", WriteBlockToFile(fp, block, sizeof(block), 1)?"Fail":"Success");
// printf("WriteFormatToFile: %s\n", WriteFormatToFile(fp)?"Fail":"Success");

rewind(fp);
// READ
// GetCharFromFile(fp);
GetLineFromFile(fp);
// GetBlockFromFile(fp);
// ReadFormatToFile(fp);

fclose(fp);
return 0;
}

时间: 2024-08-03 18:11:05

c语言文件基础知识的相关文章

Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 HTML 形式返回, Java 程序运行在服务端,最终显示在客户端.JSP 源于 Java,因而 JSP 的运行环境依赖JDK,当然也需要服务器软件(例如 Tomcat 等). 一.运行环境搭建 1.安装 JDK,请参阅之前的博文:Java学习-001-JDK安装配置 2.Tomcat部署及环境变

Java语言的基础知识9

第十一章(线程) 1.通过String name=Thread.currentThread().getName();来获取当前线程的名称. 2.多次启动一个线程或者启动一个已经运行的线程是非法的,会抛出IllegalThreadStateException异常对象. Thread.sleep((int)Math.random()*10000); 3.java提供了Runnable接口使继承了其他类之后同样可以实现该接口达到创建线程的目的Runabble接口同样定义了Run方法. 实现Runnab

[Python学习] 专题四.文件基础知识

        前面讲述了函数.语句和字符串的基础知识,该篇文章主要讲述文件的基础知识(与其他语言非常类似). 一. 文件的基本操作         文件是指存储在外部介质(如磁盘)上数据的集合.文件的操作流程为: 打开文件(读方式\写方式)->读写文件(read\readline\readlines\write\writelines)->关闭文件 1.打开文件 调用函数open打开文件,其函数格式为: file_obj=open(filename[, mode[, buffering]])

Java语言的基础知识

第三章 1.在java源文件编辑器中,选择某个成员变量,然后按住shift+alt+j,Eclipse会自动添加JavaDoc文档注释结构,如果选择的是方法,还会自动添加参数名称. 2.Java语言规定标示符是由任意的字母.下划线.美元符号和数字组成,并且第一个字符不能使数字,标示符不能使java中的保留关键字. 3.在Java语言中允许使用汉字或其他语言文字作为变量名,如int 年龄 =21;在程序运行时不会报错,但建议尽量不要使用这些语言作为变量. 4.java用关键字final来声明常量,

R语言常用基础知识

seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),    length.out = NULL, along.with = NULL, ...) 举例----------Examples----------seq(0, 1, length.out=11) seq(stats::rnorm(20)) #  seq(1, 9, by = 2)     #  seq(1, 9, by = pi)    #  seq(1, 6, by =

Java语言的基础知识4

第五章(数组) 1.在Java中可以将数组看做是一个对象虽然基本数据类型不是对象但有基本数据类型组成的数组是对象. 2.对于二维数组求第二维就用array[0].length, array.length就是默认的是第一维的长度. 3.foreach并不是一个新的语法它是for的循环的格式化主要执行遍历功能的循环,example: int arry ={1,2,3,4,5}; for(int i :array){ system.out.println(): } 4.数组元素定义完以后可通过Arra

Oracle的DML语言必备基础知识

原文:Oracle的DML语言必备基础知识 前提是咱们都已经对常用的数据操纵语言非常熟悉了,对标准SQL: SELECT子句                --指定查询结果集的列 DROM子句                 --指定查询来自哪个表或者试图 [WHERE 子句]              --指定查询的条件 [GROUP BY 子句]           --指定查询结果集的分组的条件 [HAVING 子句]             --指定分组或者集合的查询条件 [ORDERB

Java语言的基础知识12

第十四章(使用集合类保存对象) 1.java中得集合对象就像是一个容器,它用来存放Java类的对象.Java中的集合类有些方便存入和取出,有些则方便查找.集合类和数组的区别是,数组的长度是固定的,集合的长度是可变的,数组用来存放基本类型,集合用来存放对象的引用.常用的集合类有List集合,Set集合,和Map集合. 2.List集合包括List接口以及List接口的所有实现类.List集合中的元素许重复,个元素的顺序就是对象插入的顺序.类似java中的数组.List类继承了Collection接

Java语言的基础知识10

第十二章(GUI事件) 1.GUI事件的处理机制是建立交互式应用程序的关键技术,其中事件是用在程序界面上的各种操作. 2.写程序的时候对于swing的一些空间譬如jprogressbar ,jtextfield等空间在全局中声明以后,用的时候一定要new 一下,自己经常忘记(由于对java理解不深) private  JTextField textField2; textField2 = new JTextField(); 3.事件在java语言中也是一种对象 4.监听器接受到事件之后,将委托指