您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
062第十一章 文件操作03(新版)
发布时间:2021-05-08 23:03:31编辑:雪饮阅读()
大家一起来写文件图片合成器!
上篇中通過dos命令copy的/b參數完成了文件合并,那麽這次將用c語言實現這一神操作
實例如:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *f_file, *f_pic, *f_finish;
char ch, pic_name[20], file_name[20], finish_name[20];
printf("请输入要合成的图片文件名稱、文件名称、要合成的目標文件名稱: \n");
printf("图片文件名稱: ");
scanf("%s", pic_name);
printf("文件名稱: ");
scanf("%s", file_name);
printf("目標文件名稱: ");
scanf("%s", finish_name);
//拿到3個文件句柄
/*
rb:
以文件存储时原本的二进制形式原样读出,也就是"rb"的方式。
*/
if( !(f_pic = fopen(pic_name, "rb")))
{
printf("Cannot open the ficture %s!\n", pic_name);
exit(0); // 终止程序
}
if( !(f_file = fopen(file_name, "rb")))
{
printf("Cannot open the file %s!\n", file_name);
exit(0); // 终止程序
}
if( !(f_finish = fopen(finish_name, "wb")))
{
printf("Cannot open the file %s!\n", finish_name);
exit(0); // 终止程序
}
//圖片句柄寫入到目標文件句柄
/*
feof:
feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,
则返回非0值,否则返回0(即,文件结束:返回非0值;文件未结束:返回0值)。
*/
while( !feof(f_pic) )
{
/*
fgetc:
fgetc是一种计算机C语言中的函数。意为从文件指针stream指向的文件中读取一个字符,
读取一个字节后,光标位置后移一个字节。格式:int fgetc(FILE *stream);。
*/
ch = fgetc(f_pic);
/*
fputc:
fputc,是函数。函数功能: 将字符c写到文件指针fp所指向的文件的当前写指针的位置。
函数格式:int fputc (int c, FILE *fp)。
*/
fputc(ch, f_finish);
}
fclose(f_pic);
//普通文件句柄寫入到目標文件句柄
while( !feof(f_file) )
{
ch = fgetc(f_file);
fputc(ch, f_finish);
}
fclose(f_file);
//關閉目標文件句柄
fclose(f_finish);
}
編譯並運行如:
D:\cproject>m.exe
请输入要合成的图片文件名稱、文件名称、要合成的目標文件名稱:
图片文件名稱: er.png
文件名稱: nesoid.zip
目標文件名稱: 4.jpg
字符串讀出
fgets函数
函数调用形式如:fgets(str,n,fp);
函数作用:
从fp所指的文件中读出n-1个字符送入字符数
组str中,因为在最后加一个’\0’。
返回值:
str的首地址
實例如:
#include <stdio.h>
#include <stdlib.h>
#define LEN 31
void main()
{
FILE *fp;
char buffer[LEN];
/*
fopen:
fopen的函数原型为: FILE *fopen(const char *filename, const char *mode);其功能是使用给定的模式 mode 打开 filename 所指向的文件。文件顺利打开后,指向该流的文件指针就会被返回。
如果文件打开失败则返回 NULL,并把错误代码存在 error 中。该函数位于C 标准库<stdio.h>中。
文件模式:
r+以可读写方式打开文件,该文件必须存在,否则出错。
w+以可读写方式打开文件,若文件存在则文件长度清零,即该文件内容会消失。若文件不存在则建立文件。
a+以可读写方式打开文件,写时在文件原内容的末尾追加,若文件不存在则建立文件。
r打开只读文件,该文件必须存在。
w打开只写文件,若文件存在则长度清为零,若文件不存在则建立文件。
a以附加方式打开可读写文件。若文件不存在则建立文件,若文件存在则写到文件尾。
上述形态字符串都可以再加一个b字符,如rb,w+b,ab+等,加入b字符告诉函数库打开的文件为二进制文件,而非纯文字文件。
而t表示文本文件,如rt,wt,rt+等,t可省略不写。
所以rt=r,rt+=r+與t的結合
*/
if( !(fp = fopen("xkws.txt","rt")))
{
printf("\nCannot open file strike any key exit!");
exit(1);
}
/*
fgets:
从fp所指的文件中读出n-1个字符送入字符数组str中,因为在最后加一个’\0’。
*/
fgets(buffer, LEN, fp);
printf("%s\n", buffer);
fclose(fp);
}
編譯並運行結果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
字符串写入
既然实现了字符串的读出,那么字符串的写入,也就不在话下。
具体实现如:
#include <stdio.h>
#include <stdlib.h>
#define LEN 20
void main()
{
FILE *fp;
char ch, buffer[LEN];
//“at+” 读写打开一个文本文件。同意读,或在文件末追加数据
if( !(fp = fopen("xkws.txt", "at+")))
{
printf("Cannot open file strike any key exit!");
exit(1);
}
printf("Please input a string:\n");
/*
为什么不用scanf()? stdin又是啥?(小甲鱼提出的问题)
stdin:
标准输入流
fgets:
函数功能为从指定的流中读取数据,每次读取一行。
其原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。
当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
scanf:
scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。
(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include 。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
scanf遇到空格和回车就会结束
这东西随便百度一下就出来了,真特别是scanf最后“即按用户指定的格式从键盘上把数据输入到指定的变量之中”这句话已经很明显了,这还需要卖下关子?真的是醉了
所以这里的原因就是scanf涉及岛空格会结束,对于回车,由于fgets每次直接读取一行,而scanf则是会碰到回车结束,这个差别不是最大,最重要的还是空格问题,不过
不读取回车符好像也有点不好,下次使用fgets的时候会先读取一下上次那个回车符吧
当然scanf遇到空格就终止的问题也可以通过这个方案来解决:
scanf(“%[^\n]”,str);^\n 表示非\n 当遇到非\n的字符时就读入
*/
fgets(buffer, LEN, stdin);
printf("write to array string:%s \n",buffer);
/*
fputs:
fputs是一个函数,具有的功能是向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。
成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数;否则返回EOF(符号常量,其值为-1)。
*/
//从上面来自键盘的输入中的内容存储到了数组中,然后通过数组再写入到文件指针中(即写入到文件)
fputs(buffer, fp);
/*
rewind:重新定义文件内部指针去到开头处
由于fputs写入到文件中文件内部的指针会移动,指针归位是一个好习惯。
*/
rewind(fp);
//然后又从文件中再写出到标准输出中
while( ch != EOF )
{ /*
putchar:
putchar语法结构为 int putchar(int char) ,其功能是把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中
*/
putchar(ch);
ch = fgetc(fp);
}
printf("\n");
fclose(fp);
}
编译并运行结果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Please input a string:
asdasj
write to array string:asdasj
www.xkws.com
abcde
asdasj
从键盘输入4个学生的有关数据,然后把它们以二进制的格式存储到磁盘文件中
这个例题,不是很难,但是涉及到的知识点还是稍微有点多
这也是c语言最令人难受的地方。
那么实例如:
#include <stdio.h>
#define SIZE 4
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
void save()
{
FILE *fp;
int i;
/*
wb 只写方式打开或新建一个二进制文件,只允许写数据。
*/
if( !(fp = fopen("student-list", "wb")))
{
printf("Cannot open the file!\n");
return;
}
for( i=0; i < SIZE; i++ )
{
/*
fwrite() 是 C 语言标准库中的一个文件处理函数,功能是向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。该函数以二进制形式对文件进行操作,不局限于文本文件。
函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr-- 这是指向要被写入的元素数组的指针。
size-- 这是要被写入的每个元素的大小,以字节为单位。
nmemb-- 这是元素的个数,每个元素的大小为 size 字节。
stream-- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
将&stu[i]缓冲区读取的1个sizeof(struct student)字节的内容写入fp中
*/
if( fwrite(&stu[i], sizeof(struct student), 1, fp) != 1 )
{
printf("File write error!\n");
fclose(fp);
}
}
}
void main()
{
int i;
printf("Please input the student's name, num, age and address: \n");
for( i=0; i < SIZE; i++ )
{
scanf("%s %d %d %s", stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr);
}
save();
}
那么编译运行结果如:
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
Please input the student's name, num, age and address:
xy 1 age 24 xinhuaxilu
dmj 2 age 24 nanshaomen
那么由于最终写出的是二进制文件,所以普通文本编辑器看到的都是乱码。用稍微高端一点的文本编辑器如UltraEdit还能能看到一些肉眼可见的内容的
关键字词:fgets,UltraEdit,c语言,图片合成器