1.fgets和fputs

#include <stdio.h>
int fputs(const char * str, FILE * stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0' 不写入文件。
参数:
str:字符串
stream:文件指针
返回值:
成功:
失败:-
   #include<stdio.h>                                                                                          

   int main()
{
FILE *fp=fopen("10.txt","w");
//添加换行符,不然会加在后面,不会自动换行
char *p1="hello\n";
// fputs(p1,fp);
char *p2="world\n";
//指针数组,每个元素都是指针
char *p3[]={p1,p2};
int n=sizeof(p3)/sizeof(p3[]);
for(int i=;i<n;i++)
{
fputs(p3[i],fp);
}
fclose(fp);
fp=NULL;
return ;
}

#include <stdio.h>
char * fgets(char * str, int size, FILE * stream);
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
参数:
str:字符串
size:指定最大读取字符串的长度(size - )
stream:文件指针
返回值:
成功:成功读取的字符串
读到文件尾或出错: NULL
 #include<stdio.h>
#include<string.h> int main()
{
//打开文件
//读文件
//关闭文件
FILE*fp=fopen("10.txt","r");
char buf[];
//从fp所关联的文件读取内容,放到buf,一次最大读取为
sizeof(buf)-
//遇到换行符,文件结尾,出错,结束本次读取
fgets(buf,sizeof(buf),fp);
printf("buf=%s\n",buf); fgets(buf,sizeof(buf),fp);
printf("buf=%s\n",buf); fgets(buf,sizeof(buf),fp);
printf("buf=%s\n",buf);
fclose(fp);
return ;
}

边界值问题:上面的文件中,只有hello和world,但是,当你执行多次输出的时候,

后面的内容都是一样的,这是因为buf的内容没有清空造成的。使用memset函数解决

 #include<stdio.h>
#include<string.h> int main()
{
//打开文件
//读文件
//关闭文件
FILE*fp=fopen("10.txt","r");
char buf[];
//从fp所关联的文件读取内容,放到buf,一次最大读取为
sizeof(buf)-
//遇到换行符,文件结尾,出错,结束本次读取
fgets(buf,sizeof(buf),fp);
printf("buf=%s\n",buf); fgets(buf,sizeof(buf),fp);
printf("buf=%s\n",buf);
memset(buf,0,sizeof(buf)); fgets(buf,sizeof(buf),fp);
printf("buf=%s\n",buf); fclose(fp);
return ;
}

2.fprintf和fscanf

#include <stdio.h>
int fprintf(FILE * stream, const char * format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 '\0' 为止。
参数:
stream:已经打开的文件
format:字符串格式,用法和printf()一样
返回值:
成功:实际写入文件的字符个数
失败:-
  1 #include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
//打开文件
//写文件
//关闭文件
FILE *fp=fopen("10.txt","w");
int num=;
srand((unsigned int)time(NULL));
for(int i=;i<;i++)
{
num=rand()%;
//num放在%d的位置,然后此字符串写在(显示)在屏幕
// printf("%d\n",num);
//num放在%d的位置,然后此字符串写在(显示)在fp所关联的文件
fprintf(fp,"%d\n",num);
}
fclose(fp);
return ;
}

#include <stdio.h>
int fscanf(FILE * stream, const char * format, ...);
功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:
stream:已经打开的文件
format:字符串格式,用法和scanf()一样
返回值:
成功:参数数目,成功转换的值的个数
失败: -
   #include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
//打开文件
//写文件
//关闭文件
FILE *fp=fopen("10.txt","r");
int num=;
while()
{
fscanf(fp,"%d\n",&num);
printf("num=%d\n",num);
if(feof(fp))
{
break;
}
}
fclose(fp);
return ;
}

不会把文件中的换行符打印到屏幕上

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相等 函数返回值与第三个元素相等
失败:
int ret=fwrite(&s,,,fp)
  • &s,需要往文件写内容的变量首地址
  • 15 ,往文件写入内容的块大小
  • 4 ,往文件写入内容的块数目,写入文件的大小为:块大小*块数目=15*4=60
  • fp,操作的文件
  • ret,返回值=4,成功时等于块数目
  • 块大小和块文件只要想乘等于文件大小就可以,可以改变位置,可以改变大小
 #include<stdio.h>

 typedef struct Student
{
int age;
char name[];
int score;
}Student; int main()
{
FILE*fp=fopen("/home/lxd/C++project/1.txt","w");
Student s[]={
,"mike",,
,"hello",,
,"wrld",,
,"abc",,
};
int ret=fwrite(s,sizeof(s),,fp);
printf("%d\n",ret);
fclose(fp);
return ;
}

写入,但是是二进制文件,看不懂,可以通过fread读出来

int ret=fread(&s,,,fp)
  • &s,需要读取文件内容的变量首地址
  • 15 ,读取文件写入内容的块大小
  • 4 ,读取文件写入内容的块数目,读取文件的大小为:块大小*块数目=15*4=60
  • fp,操作的文件
  • ret,返回值=4,成功时等于块数目,失败是为0
  • 块大小和块文件只要想乘等于文件大小就可以,可以改变位置,可以改变大小
   #include<stdio.h>

   typedef struct Student
{
int age;
char name[];
int score;
}Student; int main()
{
FILE*fp=fopen("1.txt","r");
Student s[];
int ret=fread(&s[],sizeof(Student),,fp);
printf("ret=%d\n",ret);
int i=;
int n=;
for(i=;i<n;i++)
{
printf("%d,%s,%d\n",s[i].age,s[i].name,s[i].score);
}
fclose(fp);
return ;
}

通过fread读出1.txt中二进制内容,打印在屏幕

fread函数越界的情况

  • 如果文件内容大小<用户指定的读取大小,返回值为实际读取的块数目
int ret=fread(&s[],sizeof(Student),,fp);

  • 如果文件内容大小>用户指定的读取大小,返回值为用户指定的块数目

4.最基本的拷贝命令的实现

   #include<stdio.h>

   int main(int argc,char*argv[])
{ if(argc!=)
{
printf("error\n");
return ;
} FILE *rfp=fopen(argv[],"r");
FILE *wfp=fopen(argv[],"w");
int len;
char buf[*];
//循坏操作,从源文件读取多少,再把内容写入到目的文件,读多少,写多少
while()
{
//文件的大小用1*sizeof(buf)表示, 块文件的大小用1表示,可以避免错误
len=fread(buf,,sizeof(buf),rfp);
printf("lem%d",len);
if(len==)
{
break;
}
fwrite(buf,,len,wfp);
} fclose(rfp);
fclose(wfp); return ;
}

26个英文字母,没有问题

Linux C/C++基础 文件(下)的更多相关文章

  1. Linux C/C++基础——文件(上)

    1.文件指针 FILE* fp=NULL; fp指针,只调用了fopen(),在堆区分配空间,把地址返回给fp fp指针不是指向文件,fp指针和文件关联,fp内部成员保存在文件的状态 操作fp指针,不 ...

  2. Linux C/C++基础 文件(中)

    1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...

  3. linux运维基础之系统挂载与etc文件下介绍

    1) 目录结构说明: windows:磁盘----分区---格式化--系统 linux:磁盘--分区--生成一个文件(磁盘分区) linux 中一切皆文件 ll -h 显示人类能看懂的 mount - ...

  4. Linux Shell基础(下)

    Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...

  5. 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限

    01-文件属性内容介绍 02- inodeyublock讲解 03-访问oldboyfile的寻宝过程 04-inode与block小结 05-磁盘空间不足案例详解 06-Linux文件类型及拓展名 ...

  6. Linux入门基础之 下

    八.Linux 管道.重定向及文本处理 8.1.Linux 多命令协作:管道及重定向 8.1.1 开源文化 开源文化的核心理念之一就是不要重复发明轮子,很多的开源软件都是现有软件.代码.功能的重新组合 ...

  7. 03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-其他基础命令

    03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-{1..100}-du-cd-cp-file-mv-echo-id-she ...

  8. Linux如何下解压windows下的.zip和.rar文件

    Linux自带的unzip命令可以解压windows下的zip格式的压缩文件. 如何unzip没安装,可以yum 安装下: yum -y install unzip unzip命令 语法:unzip ...

  9. 鸟哥的Linux私房菜 基础学习篇读书笔记(9):Linux磁盘与文件系统管理(2)

    上一篇文章主要从理论上分析了Linux的Ext2文件系统.这一篇主要解说怎样查看Linux的文件系统的容量以及解说Linux文件系统中的连接文件. 能够通过df和du命令来查看磁盘与文件夹的容量.df ...

随机推荐

  1. 闭包-IIFE

    1)嵌套函数,内部函数访问了外部函数的局部变量,通过返回内部函数,在函数外部调用内部函数,从而更新外部函数的局部变量的过程: 2)代码执行完成之后离开作用域依旧存在 3)有可能发生内存泄露,若对象的引 ...

  2. Python3之正则表达式详解

    正则表达式 本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在话下. 当然对于爬虫来说,有了它,我们从HTM ...

  3. BZOJ 2946 [Poi2000]公共串 (二分+Hash/二分+后缀数组/后缀自动机)

    求多串的最长公共字串. 法1: 二分长度+hash 传送门 法2: 二分+后缀数组 传送门 法3: 后缀自动机 拿第一个串建自动机,然后用其他串在上面匹配.每次求出SAM上每个节点的最长匹配长度后,再 ...

  4. XML -- 为什么选择XML?

    1.XML是什么,主要功能? XML全称(EXtensible Markup Language),是可扩展性标记语言. XML主要功能是用来传输和存储数据.它就是一种纯文本.只要程序能访问纯文本就能访 ...

  5. URAL 2092 Bolero 贪心

    C - Bolero Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  6. codeforces613E

    Puzzle Lover CodeForces - 613E Oleg Petrov loves crossword puzzles and every Thursday he buys his fa ...

  7. Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题

    1.为什么需要ModelDriven? 所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User如下: package cn.com.leadfar.struts2 ...

  8. Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [/Cppcc] due to a StackOverflowError. Possible root causes include a too low setting for -Xs

    解决办法:(1)修改D:\Java\apache-tomcat-7.0.88\conf\catalina.properties (122line) (2)如org.apache.catalina.st ...

  9. This sample is for changing from “float64” to “int” for values did unmarshal using map[string]interface{}. When it did unmarshal using map[string]interface{}, a number with “int” was changed to “floa

    This sample is for changing from “float64” to “int” for values did unmarshal using map[string]interf ...

  10. Mybatis框架学习1:入门

    一框架介绍 1.Mybatis介绍 ​ MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c ...