1.fgets和fputs
#include <stdio.h> int fputs(const char * str, FILE * stream); 功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0' 不写入文件。 参数: str:字符串 stream:文件指针 返回值: 成功:0 失败:-1
1 #include<stdio.h> 2 3 int main() 4 { 5 FILE *fp=fopen("10.txt","w"); 6 //添加换行符,不然会加在后面,不会自动换行 7 char *p1="hello\n"; 8 // fputs(p1,fp); 9 char *p2="world\n"; 10 //指针数组,每个元素都是指针 11 char *p3[]={p1,p2}; 12 int n=sizeof(p3)/sizeof(p3[0]); 13 for(int i=0;i<n;i++) 14 { 15 fputs(p3[i],fp); 16 } 17 fclose(fp); 18 fp=NULL; 19 return 0; 20 }
#include <stdio.h> char * fgets(char * str, int size, FILE * stream); 功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。 参数: str:字符串 size:指定最大读取字符串的长度(size - 1) stream:文件指针 返回值: 成功:成功读取的字符串 读到文件尾或出错: NULL
#include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 //打开文件 7 //读文件 8 //关闭文件 9 FILE*fp=fopen("10.txt","r"); 10 char buf[100]; 11 //从fp所关联的文件读取内容,放到buf,一次最大读取为 sizeof(buf)-1 12 //遇到换行符,文件结尾,出错,结束本次读取 13 fgets(buf,sizeof(buf),fp); 14 printf("buf=%s\n",buf); 15 16 fgets(buf,sizeof(buf),fp); 17 printf("buf=%s\n",buf); 18 19 fgets(buf,sizeof(buf),fp); 20 printf("buf=%s\n",buf); 22 fclose(fp); 23 return 0; 24 }
边界值问题:上面的文件中,只有hello和world,但是,当你执行多次输出的时候,
后面的内容都是一样的,这是因为buf的内容没有清空造成的。使用memset函数解决
#include<stdio.h> 2 #include<string.h> 3 4 int main() 5 { 6 //打开文件 7 //读文件 8 //关闭文件 9 FILE*fp=fopen("10.txt","r"); 10 char buf[100]; 11 //从fp所关联的文件读取内容,放到buf,一次最大读取为 sizeof(buf)-1 12 //遇到换行符,文件结尾,出错,结束本次读取 13 fgets(buf,sizeof(buf),fp); 14 printf("buf=%s\n",buf); 15 16 fgets(buf,sizeof(buf),fp); 17 printf("buf=%s\n",buf); 18 memset(buf,0,sizeof(buf)); 19 20 fgets(buf,sizeof(buf),fp); 21 printf("buf=%s\n",buf); 22 23 fclose(fp); 24 return 0; 25 }
2.fprintf和fscanf
#include <stdio.h> int fprintf(FILE * stream, const char * format, ...); 功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 '\0' 为止。 参数: stream:已经打开的文件 format:字符串格式,用法和printf()一样 返回值: 成功:实际写入文件的字符个数 失败:-1
1 #include<stdio.h> 2 #include<time.h> 3 #include<stdlib.h> 4 int main() 5 { 6 //打开文件 7 //写文件 8 //关闭文件 9 FILE *fp=fopen("10.txt","w"); 10 int num=0; 11 srand((unsigned int)time(NULL)); 12 for(int i=0;i<10;i++) 13 { 14 num=rand()%100; 15 //num放在%d的位置,然后此字符串写在(显示)在屏幕 16 // printf("%d\n",num); 17 //num放在%d的位置,然后此字符串写在(显示)在fp所关联的文件 18 fprintf(fp,"%d\n",num); 19 } 20 fclose(fp); 21 return 0; 22 }
#include <stdio.h> int fscanf(FILE * stream, const char * format, ...); 功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。 参数: stream:已经打开的文件 format:字符串格式,用法和scanf()一样 返回值: 成功:参数数目,成功转换的值的个数 失败: - 1
1 #include<stdio.h> 2 #include<time.h> 3 #include<stdlib.h> 4 int main() 5 { 6 //打开文件 7 //写文件 8 //关闭文件 9 FILE *fp=fopen("10.txt","r"); 10 int num=0; 11 while(1) 12 { 13 fscanf(fp,"%d\n",&num); 14 printf("num=%d\n",num); 15 if(feof(fp)) 16 { 17 break; 18 } 19 } 20 fclose(fp); 21 return 0; 22 }
不会把文件中的换行符打印到屏幕上
3.fwrite和fread
#include <stdio.h> size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 功能:以数据块的方式给文件写入内容 参数: ptr:准备写入文件数据的地址 size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小 nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb stream:已经打开的文件指针 返回值: 成功:实际成功写入文件数据的块数目,此值和nmemb相等 函数返回值与第三个元素相等 失败:0
int ret=fwrite(&s,15,4,fp)
- &s,需要往文件写内容的变量首地址
- 15 ,往文件写入内容的块大小
- 4 ,往文件写入内容的块数目,写入文件的大小为:块大小*块数目=15*4=60
- fp,操作的文件
- ret,返回值=4,成功时等于块数目
- 块大小和块文件只要想乘等于文件大小就可以,可以改变位置,可以改变大小
#include<stdio.h> typedef struct Student { int age; char name[50]; int score; }Student; int main() { FILE*fp=fopen("/home/lxd/C++project/1.txt","w"); Student s[10]={ 18,"mike",18, 22,"hello",8, 34,"wrld",56, 45,"abc",45, }; int ret=fwrite(s,sizeof(s),1,fp); printf("%d\n",ret); fclose(fp); return 0; }
写入,但是是二进制文件,看不懂,可以通过fread读出来
int ret=fread(&s,15,4,fp)
- &s,需要读取文件内容的变量首地址
- 15 ,读取文件写入内容的块大小
- 4 ,读取文件写入内容的块数目,读取文件的大小为:块大小*块数目=15*4=60
- fp,操作的文件
- ret,返回值=4,成功时等于块数目,失败是为0
- 块大小和块文件只要想乘等于文件大小就可以,可以改变位置,可以改变大小
1 #include<stdio.h> 2 3 typedef struct Student 4 { 5 int age; 6 char name[50]; 7 int score; 8 }Student; 9 10 int main() 11 { 12 FILE*fp=fopen("1.txt","r"); 13 Student s[10]; 14 int ret=fread(&s[0],sizeof(Student),1,fp); 15 printf("ret=%d\n",ret); 16 int i=0; 17 int n=1; 18 for(i=0;i<n;i++) 19 { 20 printf("%d,%s,%d\n",s[i].age,s[i].name,s[i].score); 21 } 22 fclose(fp); 23 return 0; 24 } 25
通过fread读出1.txt中二进制内容,打印在屏幕
fread函数越界的情况
- 如果文件内容大小<用户指定的读取大小,返回值为实际读取的块数目
int ret=fread(&s[0],sizeof(Student),2,fp);
- 如果文件内容大小>用户指定的读取大小,返回值为用户指定的块数目
4.最基本的拷贝命令的实现
1 #include<stdio.h> 2 3 int main(int argc,char*argv[]) 4 { 5 6 if(argc!=3) 7 { 8 printf("error\n"); 9 return 0; 10 } 11 12 FILE *rfp=fopen(argv[1],"r"); 13 FILE *wfp=fopen(argv[2],"w"); 14 int len; 15 char buf[4*1024]; 16 //循坏操作,从源文件读取多少,再把内容写入到目的文件,读多少,写多少 17 while(1) 18 { 19 //文件的大小用1*sizeof(buf)表示, 块文件的大小用1表示,可以避免错误 20 len=fread(buf,1,sizeof(buf),rfp);
printf("lem%d",len); 21 if(len==0) 22 { 23 break; 24 } 25 fwrite(buf,1,len,wfp); 26 } 27 28 fclose(rfp); 29 fclose(wfp); 30 31 return 0; 32 } 33
26个英文字母,没有问题
知识的二道贩子,此博客仅仅是个人学习总结!