将文件指针复位C语言,C语言学习笔记之 文件操作

  • Post author:
  • Post category:其他


文件操作

f798071fb63f5ec79a5ebf34e0decdea.png

文件指针

操作系统通过 函数(API) 操作文件,而函数通过文件指针识别不同文件

函数 –> 文件指针 –> 文件

5cd1f1313837275183cfeb5699db753b.png

打开和关闭文件

fopen打开文件

#include

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

功能:打开文件

参数:

filename:文件名

mode:打开文件的模式

返回值:

成功:文件指针

失败:NULL

mode的赋值:

068a3e6a9c7f273672864ba71fd40eb9.png

r只读,w只写,b二进制文件,a追加,+可读可写

附:

FILE的定义:

struct _iobuf {

char *_ptr;

int _cnt;

char *_base;

int _flag;

int _file;

int _charbuf;

int _bufsiz;

char *_tmpfname;

};

typedef struct _iobuf FILE;

fd5b22c7e28e8dc0e6b49507d8d726b2.png

fclose关闭文件

#include

int fclose(FILE *stream);

功能:关闭fopen打开的文件,将缓冲区的数据写入文件中,

并释放系统提供的文件资源

参数:

stream:文件指针

返回:

成功:0

失败:-1

例:

#include

#include

int main() {

FILE *fp = NULL;

fp = fopen(“./tes”,”rb”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

printf(“打开成功\n”);

fclose(fp);

return 0;

}

# 当test文件存在时

打开成功

# 当不存在时

fopen: No such file or directory

文件读写

fputc往文件写一个字符

#include

int fputc(int ch,FILE *stream);

功能:将ch转换为unsigned char后写入stream文件中

参数:

ch:字符

stream:文件指针

返回:

成功:成功写入文件的字符

失败:返回-1

例:

d0ea3aa638e4840552f744bb1381cda3.png

fgetc读取一个字符

#include

int fgetc(FILE *stream);

功能:从stream指定的文件里读取一个字符

参数:

stream:文件指针

返回:

成功:读取到的字符

失败:-1

判断文件结束

EOF 宏 -1 文本文件

feof 函数 文本文件和二进制文件

int feof(FILE *stream);

功能:检测是否读到了文件结尾。判断的是最后一次“读操作的

内容”,不是当前位置内容(上一个内容)

参数:

stream:文件指针

返回:

非0值:已经到文件结尾

0:未到文件结尾

例:

#include

#include

int main() {

FILE *fp = NULL;

fp = fopen(“./hello.txt”,”r”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

// 操作文件

while (1) {

char ch = 0;

ch = fgetc(fp);

// 判断文件末尾

// EOF

// if (ch == EOF)

// {

//break;

// }

if (feof(fp)) {

break;

}

printf(“%c”,ch);

}

printf(“\n”);

fclose(fp);

return 0;

}

Hello file

实例1:二进制文件读取器

#include

#include

int main(int argc, char *argv[])

{

if (argc < 2)

{

printf(“ERROR:参数过少。。。”);

exit(1);

}

else if (argc > 2)

{

printf(“ERROR:参数过多。。。”);

exit(1);

}

else

{

FILE *fp = NULL;

fp = fopen(argv[1], “rb”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

while (1)

{

char ch = 0;

ch = fgetc(fp);

if (feof(fp))

{

printf(“\n”);

break;

}

printf(“%-#x\t”, ch);

}

}

return 0;

}

效果:

adaceb38d8ab345aae5f36ec932b73b4.png

fputs写入字符串

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

功能:将str字符串写入stream文件中

参数:

str:字符串

stream:文件指针

返回:

成功:0

失败:-1

例:

#include

#include

int main() {

FILE *fp = NULL;

fp = fopen(“./hello.txt”,”w”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

// 操作文件

char *buf[] = {“大漠孤烟直\n”,”长河落日园”};

for (size_t i = 0; i < sizeof(buf)/sizeof(buf[0]); ++i) {

fputs(buf[i],fp);

}

fclose(fp);

return 0;

}

# hello.txt

大漠孤烟直

长河落日园

fgets获取一行

#include

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

功能:从stream文件中读取字符,写入str中,

直到出现换行符、文件结尾或已经读了size-1个字符为止,

最后会自动加上’\0′

参数:

str:字符串

size:最大读取字符串的长度

stream:文件指针

返回:

成功:字符串

读到文件尾或出错:NULL

例:四则运算解题神器

题目:

b71862f338f70d9e6e64faeebb6e5e78.png

代码:

#include

#include

int main() {

FILE *fp = fopen(“题目.txt”,”r”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

char buf[128] = “”;

while (fgets(buf,sizeof(buf),fp))

{

int num1 = 0, num2 = 0;

char ch = 0;

// 解包

sscanf(buf, “%d%c%d=”, &num1, &ch, &num2);

// 计算

int sum = 0;

switch (ch)

{

case ‘+’:

sum = num1 + num2;

break;

case ‘-‘:

sum = num1 – num2;

break;

case ‘*’:

sum = num1 * num2;

case ‘/’:

sum = num1 / num2;

break;

}

printf(“%d%c%d = %d\n”,num1,ch,num2,sum);

}

if (fp != NULL)

{

fclose(fp);

fp = NULL;

}

return 0;

}

1+1 = 2

102+3424 = 3526

483989-334224 = 149765

2304*381 = 6

3424*31555 = 0

333333321/34243 = 9734

32543625/55423 = 587

文件高级操作

文件重命名和删除

d790180abbd2d6cb2c580e6a8be1e112.png

文件的块读写

将内存中的数据原样输出在文件

fwrite

#include

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

功能:把 ptr 所指向的数组中的数据写入到stream 中

参数:

ptr:指向要被写入的元素数组的指针。

size:要被写入的每个元素的大小,以字节为单位。

nmemb:元素的个数,每个元素的大小为 size 字节

stream:文件指针

返回:

如果成功,该函数返回一个 size_t 对象,

表示元素的总数,该对象是一个整型数据类型。

如果该数字与 nmemb 参数不同,则会显示一个错误

#include

#include

typedef struct {

char name[16];

int age;

float score;

}stu;

int main() {

stu student[3] = {

{“小李”,13,100},

{“小红”,14,119},

{“小明”,15,120}

};

FILE *fp = fopen(“./student.txt”,”w”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

fwrite(student,sizeof(stu),3,fp);

fclose(fp);

return 0;

}

381c0022510b9adbc97eb89291d373cc.png

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从给定流 stream 读取数据到 ptr 所指向的数组中

参数:

ptr:指向带有最小尺寸 size*nmemb 字节的内存块的指针

size:要读取的每个元素的大小,以字节为单位

nmemb:元素的个数,每个元素的大小为 size 字节

stream:文件指针

返回:

成功读取的元素总数会以 size_t 对象返回,

size_t 对象是一个整型数据类型。

如果总数与 nmemb 参数不同,

则可能发生了一个错误或者到达了文件末尾

#include

#include

typedef struct {

char name[16];

int age;

float score;

}stu;

int main() {

stu student[3];

FILE *fp = fopen(“./student.txt”,”r”);

if (fp == NULL)

{

perror(“fopen”);

exit(1);

}

int n = fread(student,sizeof(stu),3,fp);

for (size_t i = 0; i < n; ++i)

{

printf(“name = %s, age = %d, score = %.2f\n”,student[i].name,student[i].age,student[i].score);

}

fclose(fp);

return 0;

}

name = 小李, age = 13, score = 100.00

name = 小红, age = 14, score = 119.00

name = 小明, age = 15, score = 120.00

格式化读写

fprintf

9654e532a7b59feab1103a8519195d39.png

fscanf

d0b8daf13d0cc9acf5d93f6bea5f4d2e.png

复位流指针

c53b22f81cf58b734b5a51493a10f2c2.png

9b31228d1a60eea0eb7fcc64ed2b35b4.png

设置文件流指针

8ff3f63d5e8c824010c97c591cb03367.png

成功:0;失败:-1

7389a28b1021d525e2eb449af34b6a55.png

ftell返回文件流指针距离文件首部的偏移量(字节)

a1d7fa953c65091c40dfaa33915f6841.png

8fb3e2ef3e00e0ff2e4651d6cb28d808.png

获取文件状态

a4db421c57b5f5f8e47a59bbce2c1e96.png

d542bf3edd2ea42a31cdf1183d57f96f.png

5a350ea5bf4398644ac2e03c8114d501.png

缓冲区

4e6e183dc4e81629ef468154d2b94d30.png

标签:fp,文件,stream,int,笔记,C语言,include,size

来源: https://www.cnblogs.com/zhujiangyu/p/13765369.html