C语言文件相关基础知识

时间: 2020-07-19 18:16

1,mode打开方式

  1. “r” 以 “读” 的方式打开一个文本文件 (只读)

  2. “r+” 与 “r” 的区别在于, 增加了 “写” (可读可写)

  3. “rb” 以 “读” 的方式打开一个二进制文件 (只读)

  4. “rb+” 与 “rb” 的区别在于, 增加了 “写” (可读可写)

  5. “w” 以 “写” 的方式打开一个文本文件, 同时原文件的内容将被新写入的数据覆盖, 如果这个文件不存在将会创建一个文件

  6. “w+” 与 “w” 的区别在于, 增加了 “读”

  7. “wb” 以 “写” 的方式打开一个二进制文件

  8. “wb+” 与 “wb” 的区别在于, 增加了 “读”

  9. “a” 以 “尾部追加” 的方式打开一个文本文件 (只写)

  10. “a+” 以 “a” 的区别在于, 增加了 “读” (可读可写)

  11. “ab” 以 “尾部追加” 的方式打开一个二进制文件 (只写)

  12. “ab+” 与 “ab” 的区别在于, 增加了 “读” (可读可写)

2,文件的打开与关闭

  1. fopen 打开

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

    filename: 指向所要打开的文件的指针

    mode : 文件的打开方式

    返回一个该文件的指针.如果发生错误, fopen()返回NULL

  2. fclose 关闭

    int fclose(   FILE *stream );
    

    stream: 指向所要关闭的文件的指针

    执行成功时返回0,否则返回EOF.

eg.

#include <stdio.h>

int main() {

	FILE* file = NULL;	//文件指针
	char str[64];

	file = fopen("test.txt", "r");	//以 "r" 只读方式打开一个文件, 并返回该文件的指针

	if (file) {	//如果文件指针非空, 则打开成功
		fgets(str, sizeof(str), file);
		puts(str);

		fclose(file);	//关闭文件
	}
	else {	//如果文件指针为空指针, 则打开失败
		printf("文件打开失败\n");
	}

	return 0;
}

3,fgetc 与 fputc

  1. fgetc 从指定文件读取一个字符
int fgetc(	FILE *stream );

​ stream: 文件指针

​ 返回值是字符, 如果到达文件尾或者发生错误时返回EOF.

  1. fputc 向指定文件输入一个字符
int fputc(	int c,	FILE *stream );

​ c: 要输入的字符

​ stream: 文件指针

​ 返回值是字符, 发生错误时返回值是EOF.

eg.

#include <stdio.h>

int main() {

	FILE* file = NULL;	//文件指针
	char c;

	file = fopen("源.cpp", "r");	//以 "r" 只读方式打开一个文件, 并返回该文件的指针

	if (file) {	//如果文件指针非空, 则打开成功
		while (1) {
			c = fgetc(file);	//从指定文件中读取一个字符, 并返回
			if (c == EOF) {		//如果文件全部读取完, 则跳出循环
				break;
			}
			fputc(c, stdout);	//将字符 c 输入到标准输出设备, 屏幕(stdout)
		}

		fclose(file);	//关闭文件
	}
	else {	//如果文件指针为空指针, 则打开失败
		printf("文件打开失败\n");
	}

	return 0;
}

4,fgets 与 fputs

  1. fgets 从指定文件读取一个指定大小的字符串 (一行)

    char *fgets(	char *str,	int numChars,	FILE *stream	);
    

    str: 数据的存储位置

    numChars: 要读取的最大字符数 (最多读取 numChars - 1 个字符, 最后一个位置存放字符串结束符)

    stream: 指向文件结构的指针

    如果fgets()达到[numChars - 1]个字符或者遇到EOF, str(字符串)将会以null结束.fgets()成功时返回str(字符串),失败时返回NULL.

  2. fputs 向指定文件输入一个字符串

    int fputs(	const char *str,	FILE *stream	);
    

    str: 输入的字符串

    stream: 指向文件结构的指针

    成功时返回非负值, 失败时返回EOF.

eg.

#include <stdio.h>

int main() {

	FILE* file = NULL;	//文件指针
	char str[128];
	char* p = NULL;

	file = fopen("源.cpp", "r");	//以 "r" 只读方式打开一个文件, 并返回该文件的指针

	if (file) {	//如果文件指针非空, 则打开成功
		while (1) {
			p = fgets(str, sizeof(str), file);	//从指定文件中读取一行字符, 若读取失败则返回 NULL
			if (!p) {	//如果读取到文件的末尾, 则跳出循环
				break;
			}
			fputs(str, stdout);	//将字符串 str 输出到标准输出设备, 屏幕(stdout)
		}

		fclose(file);	//关闭文件
	}
	else {	//如果文件指针为空指针, 则打开失败
		printf("文件打开失败\n");
	}

	return 0;
}

5,fprintf 与 fscanf

  1. fprintf 设置格式并将一系列字符和值输出到输出

    int fprintf(
       FILE *stream,
       const char *format [,
       argument ]...
    );
    

    stream: 指向文件结构的指针。

    format: 窗体控件字符串。

    返回写入的字节数, 输出错误时返回一个负值

  2. fscanf 函数从 的当前位置将数据读取到由参数(如果有)指定的位置

    int fscanf(
       FILE *stream,
       const char *format [,
       argument ]...
    );
    

    stream: 指向文件结构的指针。

    format: 窗体控件字符串。

    返回成功转换并分配的字段数;返回值不包括已读取但未分配的字段。 返回值为 0 表示没有分配任何字段, 如果发生错误,或者在第一次转换之前到达文件流的末尾,则返回值为 EOF

eg.

#include <stdio.h>

int main() {

	FILE* file = NULL;
	char str[64];

	file = fopen("test.txt", "w");
	if (file) {
		fprintf(file, "%s", "world");	//将格式化字符输出到 file 中
		fclose(file);
	}
	else {
		printf("文件打开失败");
	}

	file = fopen("test.txt", "r");
	if (file) {
		fscanf(file, "%s", str);	//从 file 中读取匹配的字符串到 str
		puts(str);
		fclose(file);
	}
	else {
		printf("文件打开失败");
	}

	return 0;
}

6,fwrite 与 fread

  1. fwrite 将数据写入流。

    size_t fwrite(
       const void *buffer,
       size_t size,
       size_t count,
       FILE *stream
    );
    

    buffer: 指向要写入的数据的指针。

    size: 项大小(以字节为单位)。
    count: 要写入的项的最大数量。

    stream: 指向文件结构的指针。

    fwrite返回实际写入的完整项的数量,如果发生错误,则可能小于计数

  2. fread 从流读取数据。

    size_t fread(
       void *buffer,
       size_t size,
       size_t count,
       FILE *stream
    );
    

    buffer: 数据的存储位置。
    size: 项大小(以字节为单位)。

    count: 要读取的项的最大数量。

    stream: 指向文件结构的指针。

    fread返回实际读取的完整项的数量,如果发生错误,或者在到达计数之前遇到文件末尾,则此值可能小于计数

    eg. fwrite

#include <stdio.h>

int main() {

	FILE* file = NULL;
	int str = 888;

	file = fopen("binary.txt", "wb");	//以二进制写的方式打开一个文件
	if (file) {
		fwrite(&str, sizeof(int), 1, file);	//将数据写入流
		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}
	
	return 0;
}

​ eg.fread

#include <stdio.h>

int main() {

	FILE* file = NULL;
	char arr[32];
	int str;

	file = fopen("binary.txt", "rb");	//以二进制读的方式打开一个文件
	if (file) {
		fread(arr, sizeof(char), sizeof(arr), file);	//从流读取数据。
		fread(&str, sizeof(int), 1, file);
		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}

	printf("%s\t%d\n", arr, str);
	
	return 0;
}

7,_putw 与 _getw

  1. _putw 将一个整数写入到流中。

    int _putw(
       int binint,
       FILE *stream
    );
    

    binint
    要输出的二进制整数。

    stream
    指向文件结构的指针。

    返回写入的值。 返回值EOF可能指示错误

  2. _getw 从流中获取整数。

    int _getw(
       FILE *stream
    );
    

    stream
    指向文件结构的指针。

    _getw返回读取的整数值。 EOF的返回值指示错误或文件尾

eg.

#include <stdio.h>

int main() {

	FILE* file = NULL;
	int ret = 0;

	file = fopen("num.txt", "wb");	//以二进制写的方式打开一个文件
	if (file) {
		for (int i = 0; i < 10; ++i) {
			_putw(i, file);	//将 i 以二进制的形式写入 file 中 
		}
		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}
	
	file = fopen("num.txt", "rb");	//以二进制读的方式打开一个文件
	if (file) {
		while (1) {
			ret = _getw(file);	//从文件中读取 int 类型的二进制值, 并返回

			if (feof(file)) {	//如果文件读取完则跳出循环
				break;
			}

			printf("%d", ret);
		}
		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}

	return 0;
}

8,feof

feof 判断是否到达文件的末尾

int feof(
   FILE *stream
);

stream
指向文件结构的指针。

如果读取操作已尝试读取超过文件末尾的值, feof函数将返回非零值;否则返回0。

eg.

#include <stdio.h>

int main() {
	FILE* file = NULL;
	char c;
	
	file = fopen("源.cpp", "r");

	if (file) {
		while (1) {
			c = fgetc(file);

			if (feof(file)) {	//判断是否到达文件的末尾
				break;
			}

			fputc(c, stdout);
		}

		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}

	return 0;
}

9,ferror 与 perror

  1. ferror 检测文件是否发生错误
int ferror(
   FILE *stream
);

stream

指向文件结构的指针。

如果中未发生错误,则ferror将返回0。 否则,返回一个非零值。

  1. perror 打印错误消息。

    void perror(
       const char *message
    );
    

    message
    要打印的字符串消息。(随便写)(将会自动拼接到错误信息的前端)

eg.

#include <stdio.h>

int main() {
	FILE* file = NULL;
	
	file = fopen("源.cpp", "r");	//以只读方式打开一个文件
	if (file) {
		fputc('A', file);	//向文件中写入一个字符
		if (ferror(file)) {	//检测是否发生错误
			perror("错误信息: ");	//打印错误信息
		}
		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}
	
	return 0;
}

10,clearerr_s

clearerr_s 重置流的错误指示符

errno_t clearerr_s(
   FILE *stream
);

stream
指向文件结构的指针

如果成功,则返回零;如果streamNULL,则返回EINVAL

eg.

#include <stdio.h>

int main() {
	FILE* file = NULL;
	
	file = fopen("源.cpp", "r");	//以只读方式打开文件
	if (file) {
		fputc('A', file);	//向文件中写入一个字符
		if (ferror(file)) {	//检测是否有错误
			perror("错误信息: ");	//打印错误信息
			clearerr_s(file);	//清除错误标志
		}
		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}
	
	return 0;
}

11,ftell

ftell 获取文件指针的当前位置。

long ftell(
   FILE *stream
);

stream

指向文件结构的指针

ftell返回当前文件位置。

eg.

#include <stdio.h>

int main() {
	FILE* file = NULL;
	long index = -1;
	
	file = fopen("源.cpp", "r");	//以只读方式打开文件
	if (file) {
		index = ftell(file);	//获取当前文件指针的位置
		printf("%d\n", index);	//打印当前位置

		fgetc(file);	//读取文件中的一个字符

		index = ftell(file);	//获取当前文件指针的位置
		printf("%ld\n", index);	//打印当前位置

		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}
	
	return 0;
}

12,fseek

fseek 将文件指针移到指定位置。

int fseek(
   FILE *stream,
   long offset,
   int origin
);

stream
指向文件结构的指针。

offset
偏移量

origin
初始位置。(SEEK_SET 从文件开始的位置定位, 此时参数2, 必须大于0

​ SEEK_CUR 从文件当前位置开始定位

​ SEEK_END 从文件结束位置开始定位, 此时参数2, 必须小于0)

eg.

#include <stdio.h>

int main() {
	FILE* file = NULL;
	char arr[64];
	char arr2[64];
	char c;
	
	file = fopen("源.cpp", "r");	//以只读方式打开文件
	if (file) {
		fseek(file, -32, SEEK_END);	//定位到文件的最后倒数第32个字符处
		while ((c = fgetc(file)) != EOF) {	//从倒数第32个字符处开始读取至文件末尾
			putc(c, stdout);
		}

		fseek(file, 0, SEEK_SET);	//定位到文件的开始位置
		fgets(arr, sizeof(arr), file);	//读取一行
		puts(arr);	//将字符串写入 stdout

		fseek(file, 10, SEEK_CUR);	//定位到当前位置往后10个字符处
		fgets(arr2, sizeof(arr2), file);	//读取一行
		puts(arr2);	//将字符串写入 stdout

		fclose(file);
	}
	else {
		printf("文件打开失败\n");
	}
	
	return 0;
}
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值