C语言 NOTE15

===========================================
fopen ( 打开文件 )

  • 头文件
    #include <stdio.h>
  • 定义函数
FILE * fopen(const char * path, const char * mode);
  • 函数说明
  • 参数 path 字符串包含欲打开的文件路径及文件名, 参数 mode 字符串则代表着流形态.
    mode 有下列几种形态字符串:
    r 打开只读文件, 该文件必须存在.
    r+ 打开可读写的文件, 该文件必须存在.
    w 打开只写文件, 若文件存在则文件长度清为 0, 即该文件内容会消失. 若文件不存在则建立该文件.
    w+ 打开可读写文件, 若文件存在则文件长度清为零, 即该文件内容会消失. 若文件不存在则建立该文件.
    a 以附加的方式打开只写文件. 若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾, 即文件原先的内容会被保留.
    a+ 以附加方式打开可读写的文件. 若文件不存在, 则会建立该文件, 如果文件存在, 写入的数据会被加到文件尾后, 即文件原先的内容会被保留.
  • 返回值
    文件顺利打开后, 指向该流的文件指针就会被返回. 若果文件打开失败则返回 NULL, 并把错误代码存在errno 中. 附加说明 一般而言, 开文件后会作一些文件读取或写入的动作, 若开文件失败, 接下来的读写动作也无法顺利进行, 所以在 fopen()后请作错误判断及处理.

===========================================
fread ( 从文件流读取数据 )

  • 头文件
    #include <stdio.h>
  • 定义函数
size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
  • 函数说明
    fread()用来从文件流中读取数据. 参数 stream 为已打开的文件指针, 参数 ptr 指向欲存放读取进来的数据空间, 读取的字符数以参数 sizenmemb 来决定. Fread()会返回实际读取到的 nmemb 数目, 如果此值比参数 nmemb 来得小, 则代表可能读到了文件的尾或有错误发生, 这时必须用 feof()或 ferror()来决定发生什么情况.
  • 返回值
    返回实际读取到的 nmemb 数目.

===========================================
fwrite ( 将数据写至文件流 )

  • 头文件
    #include <stdio.h>
  • 定义函数
size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
  • 函数说明
    fwrite()用来将数据写入文件流中. 参数 stream 为已打开的文件指针, 参数 ptr 指向欲写入的数据地址, 总共写入的字符数以参数 size*nmemb 来决定.Fwrite()会返回实际写入的 nmemb 数目.
  • 返回值
    返回实际写入的 nmemb 数目.

===========================================
fseek ( 移动文件流的读写位置 )

  • 头文件
    #include <stdio.h>
  • 定义函数
int fseek(FILE * stream, long offset, int whence);
  • 函数说明
    fseek()用来移动文件流的读写位置. 参数 stream 为已打开的文件指针, 参数 offset 为根据参数 , whence 来移动读写位置的位移数,参数 whence 为下列其中一种:
    SEEK_SET 从距文件开头 offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
    SEEK_END 将读写位置指向文件尾后再增加 offset 个位移量. 当 whence 值为 SEEK_CUR 或SEEK_END 时, 参数 offset 允许负值的出现.
    下列是较特别的使用方式:
  1. 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
  2. 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);
  • 返回值
    当调用成功时则返回 0, 若有错误则返回-1, errno 会存放错误代码.

===========================================
fclose ( 关闭文件 )

  • 头文件
    #include <stdio.h>
  • 定义函数
int fclose(FILE * stream);
  • 函数说明
    fclose()用来关闭先前 fopen()打开的文件. 此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源.
  • 返回值
  • 若关文件动作成功则返回 0, 有错误发生时则返回 EOF 并把错误代码存到 errno.错误代码 EBADF 表示参数 stream 非已打开的文件.

===========================================
feof ( 检查文件流是否读到了文件尾 )

  • 头文件
    #include <stdio.h>
  • 定义函数
int feof(FILE * stream);
  • 函数说明
    feof()用来侦测是否读取到了文件尾, 尾数 stream 为 fopen()所返回之文件指针. 如果已到文件尾则返回非零值, 其他情况返回 0.
  • 返回值
  • 返回非零值代表已到达文件尾.

===========================================
fgetc ( 由文件中读取一个字符 )

  • 头文件
    include<stdio.h>
  • 定义函数
 int fgetc(FILE * stream);
  • 函数说明
    fgetc()从参数 stream 所指的文件中读取一个字符. 若读到文件尾而无数据时便返回 EOF.
  • 返回值
    getc()会返回读取到的字符, 若返回 EOF 则表示到了文件尾.

===========================================
fgets ( 由文件中读取一字符串 )

  • 头文件
    include<stdio.h>
  • 定义函数
char * fgets(char * s, int size, FILE * stream);
  • 函数说明
    fgets()用来从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间, 直到出现换行字符、读到文件尾或是已读了 size-1 个字符为止, 最后会加上 NULL 作为字符串结束.
  • 返回值
    gets()若成功则返回 s 指针, 返回 NULL 则表示有错误发生.

===========================================
fileno ( 返回文件流所使用的文件描述词 )

  • 头文件
    #include <stdio.h>
  • 定义函数
 int fileno(FILE * stream);
  • 函数说明
    fileno()用来取得参数 stream 指定的文件流所使用的文件描述词.
  • 返回值
    返回文件描述词.

===========================================
fputc ( 将一指定字符写入文件流中 )

  • 头文件
    #include <stdio.h>
  • 定义函数
int fputc(int c, FILE * stream);
  • 函数说明
    fputc 会将参数 c 转为 unsigned char 后写入参数 stream 指定的文件中.
  • 返回值
    fputc()会返回写入成功的字符, 即参数 c. 若返回 EOF 则代表写入失败.

===========================================
fputs ( 将一指定的字符串写入文件内 )

  • 头文件
    #include <stdio.h>
  • 定义函数
 int fputs(const char * s, FILE * stream);
  • 函数说明
    fputs()用来将参数 s 所指的字符串写入到参数 stream 所指的文件内.
  • 返回值
    若成功则返回写出的字符个数, 返回 EOF 则表示有错误发生.

===========================================
rewind ( 重设文件流的读写位置为文件开头 )

  • 头文件
    #include <stdio.h>
  • 定义函数
void rewind(FILE * stream);
  • 函数说明
    rewind()用来把文件流的读写位置移至文件开头. 参数 stream 为已打开的文件指针. 此函数相当于调用 fseek(stream, 0, SEEK_SET).

===========================================
fscanf ( 格式化字符串输入 )

  • 头文件
    #include <stdio.h>
    定义函数
int fscanf(FILE * stream, const char *format, ...);
  • 函数说明
    fscanf()会自参数 stream 的文件流中读取字符串, 再根据参数 format 字符串来转换并格式化数据.格式转换形式请参考 scanf(). 转换后的结构存于对应的参数内.
  • 返回值
    成功则返回参数数目, 失败则返回-1, 错误原因存于 errno 中.

demo:

/********************************************************************
  > File Name: 2.bmp图片处理.c
  > Author: xiening
  > Mail:  [email protected]  
  > Created Time: 2019年11月20日 星期三 10时09分07秒
 *******************************************************************/

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

int main(int argc, char const *argv[])
{
	if(4 > argc)
	{
		printf("use: R G B \n");
		return -1;
	}
	//打开文件
	FILE *fp = fopen("./image.bmp", "r+");
	if(NULL == fp)
	{ 
		perror("open error\n");
		return -1;
	}

	//文件流指针偏移
	fseek(fp, 54, SEEK_SET);

	//读文件:
	char buf[3*800*480];
	int ret = fread(buf, 3, 800*480, fp);
	if(800*480 != ret)
	{
		perror("read error\n");
		return -1;
	}

	//写文件:在原来的基础上画个矩形颜色为R G B 范围:(宽:210-577 高:105-366)
	for(int i=105; i<366; i++)
	{
		for(int j=210; j<577; j++)
		{
			buf[(i*800+j)*3] = atoi(argv[3]);
			buf[(i*800+j)*3+1] = atoi(argv[2]);
			buf[(i*800+j)*3+2] = atoi(argv[1]);
		}
	}
	fseek(fp, 54, SEEK_SET);
	fwrite(buf, 3, 800*480, fp);

	//关闭文件:
	fclose(fp);

    return 0 ;
}

发布了52 篇原创文章 · 获赞 2 · 访问量 2019

猜你喜欢

转载自blog.csdn.net/weixin_42191545/article/details/103156149
今日推荐