c语言向二进制文件中写入0x00,C语言 :文件操作 -2

C语言获取文件大小:

#define _CRT_SECURE_NO_WARNINGS //去掉安全检查

#include

#include

#include

char path1[100] = "C:\\Users\\whx\\Desktop\\test.txt"; //文本文件

char path2[100]= "C:\\Users\\whx\\Desktop\\SpaceSniffer.exe"; //二进制文件

char* ch1 = ".txt";

char* ch2 = ".exe";

int get_file_size(char* path);

int get_file_type(char* path);

void main()

{

int num1= get_file_size(path1);

int num2 = get_file_size(path2);

printf(".txt= %d ; .exe= %d \n",num1, num2);

system("pause");

}

//获取文件大小

int get_file_size(char* path)

{

int count = -1;

FILE* fp=NULL;

if (path == NULL)

{

return count;

}

int flag= get_file_type(path);

if (flag == 1)

{

fp = fopen(path, "r");

}

else if (flag==2)

{

fp = fopen(path, "rb");

}

if (fp != NULL)

{

while (!feof(fp))

{

fgetc(fp);

count++;

}

fclose(fp);

}

return count;

}

/*--------------------------

判断文件类型

.txt 返回 1

.exe 返回 2

--------------------------*/

int get_file_type(char* path)

{

int result = 0;

const char* pStr;

pStr = strrchr(path, '.'); // 判断输入的文件名最后输出.的位置

char str[6] = { 0 };

if (pStr != NULL)

{

strcpy(str, pStr);

if (strncmp(str, ch1,sizeof(ch1))==0)

{

result = 1;

}

else if (strncmp(str, ch2, sizeof(ch2)) == 0)

{

result = 2;

}

}

return result;

}

651234dffa0884ee6fd3fa1c1b04ed4e.png

a42b04da63ff8e8255242447e871e4cf.png

fseek 函数:

功 能: 重定位流上的文件指针

用 法: int fseek(FILE *stream, long offset, int fromwhere);

描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字     节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

返回值: 成功,返回0,否则返回其他值。

第一个参数stream为文件指针

第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移

第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET: 文件开头

SEEK_CUR: 当前位置

SEEK_END: 文件结尾

其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.

ftell 函数:

函数原型:long int ftell(FILE *stream)  stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回值:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

修改上面代码:

if (fp != NULL)

{

/*while (!feof(fp))

{

fgetc(fp);

count++;

}*/

fseek(fp, 0, SEEK_END);//文件指针移动到文件末尾

count = ftell(fp);//获取当前文件指针距离文件开始的长度

fclose(fp);

}

3af732f55069c0d5224e94a6c1ba7f37.png

fgets 函数:

C 库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

参数:

str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。

n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。

stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

返回值:

如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。

如果发生错误,返回一个空指针。

#define _CRT_SECURE_NO_WARNINGS //去掉安全检查

#include

#include

#include

char path1[100] = "C:\\Users\\whx\\Desktop\\数学符号.txt"; //文本文件

#define MAX_LEN 256

void main()

{

FILE *pfr = fopen(path1, "r");

if (pfr != NULL)

{

int i = 0;

/*while (!feof(pfr)) //方法1

{

char str[MAX_LEN] = { 0 };

fgets(str, MAX_LEN-1, pfr);

printf("【 %d 】 : %s",i++, str);

}*/

char str[MAX_LEN] = { 0 };

while (fgets(str, MAX_LEN-1, pfr)!=NULL) //方法2

{

printf("【 %d 】 : %s", i++, str);

}

fclose(pfr);

}

system("pause");

}

09090c4631c86ed242349337c0a3d525.png

6fd574a62b9fdefffb034d547b23d7e5.png

与源文件对比可以看出是按行读取的,是因为:该函数从stream所指的文件中读取以'\n'结尾的一行(包括'\n'在内)存到缓冲区str中,并且在该行末尾添加一个'\0'组成完整的字符串。另外,fgets()函数不适合取二进制的文件,这样,容易发生错误。

注:fgets从指定的文件中读一行字符到调用者提供的缓冲区中,gets从标准输入读一行字符到调用者提供的缓冲区中。

1.当遇到换行符或者缓冲区已满,fgets就会停止,返回读到的数据,值得注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。

2.每次调用,fgets都会把缓冲区的最后一个字符设为null,这意味着最后一个字符不能用来存放需要的数据,所以如果有一行,含有LINE_SIZE个字符(包括换行符),要想把这行读入缓冲区,请把参数n设为LINE_SIZE+1

3. 由结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以null字符结尾,对fgets的下一次调用会继续读该行。

注意,对于fgets来说,'\n'是一个特别的字符,而'\0'并无任何特别之处,如果读到'\0'就当作普通字符读入。如果文件中存在'\0'字符(或者0x00字节),调用fgets之后就无法判断缓冲区中的'\0'究竟是从文件读上来的字符还是由fgets自动添加的结束符,所以fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有'\0'。

fputs 函数:

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

返回值:成功返回一个非负整数(一般是0 【'\0'】),出错返回EOF。

fputs向指定的文件写入一个字符串,puts向标准输出写入一个字符串。

缓冲区s中保存的是以'\0'结尾的字符串,fputs将该字符串写入文件stream,但并不写入结尾的'\0'。与fgets不同的是,fputs并不关心的字符串中的'\n'字符,字符串中可以有'\n'也可以没有'\n'。puts将字符串s写到标准输出(不包括结尾的'\0'),然后自动写一个' \n'到标准输出。

fgets 和 fputs 复制文件:

#define _CRT_SECURE_NO_WARNINGS //去掉安全检查

#include

#include

#include

char path1[100] = "C:\\Users\\whx\\Desktop\\数学符号.txt"; //文本文件

char path2[100] = "C:\\Users\\whx\\Desktop\\数学符号A.txt"; //文本文件

#define MAX_LEN 256

void main()

{

FILE *pfr = fopen(path1, "r");

FILE* pfw = fopen(path2, "w");

if (pfr != NULL&& pfw!=NULL)

{

int i = 0;

/*while (!feof(pfr)) //方法1

{

char str[MAX_LEN] = { 0 };

fgets(str, MAX_LEN-1, pfr);

printf("【 %d 】 : %s",i++, str);

}*/

char str[MAX_LEN] = { 0 };

while (fgets(str, MAX_LEN-1, pfr)!=NULL) //方法2

{

//printf("【 %d 】 : %s", i++, str);

fputs(str, pfw);//写入到文件

}

fclose(pfr);

fclose(pfw);

}

system("pause");

}

181a123219c254044caed4bf9c78521f.png

分类写入文件:

#define _CRT_SECURE_NO_WARNINGS //去掉安全检查

#include

#include

#include

#define MAX_LEN 256

char pathA[100] = "C:\\Users\\whx\\Desktop\\test.txt";

char path1A[100] = "C:\\Users\\whx\\Desktop\\testMin.txt";

char path2A[100] = "C:\\Users\\whx\\Desktop\\testMax.txt";

void main()

{

FILE *pfr= fopen(pathA, "r");

FILE* pfw_min = fopen(path1A, "w");

FILE* pfw_max = fopen(path2A, "w");

if (pfr != NULL && pfw_min != NULL && pfw_max != NULL)

{

char str[MAX_LEN] = { 0 };

while (fgets(str, MAX_LEN - 1, pfr) != NULL)

{

int len = strlen(str);

if (len >= 25)

{

fputs(str, pfw_max);//写入到文件

}

else

{

fputs(str, pfw_min);//写入到文件

}

}

fclose(pfr);

fclose(pfw_min);

fclose(pfw_max);

}

system("pause");

}

7b76516c999b7dbf8bda0d5e4ff970db.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值