海安零距离 海安论坛 海安新闻 海安

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1976|回复: 0

C/C++程序从文本文件中读取(保存)数据

[复制链接]

6234

主题

6234

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
18716
发表于 2019-12-27 14:51 | 显示全部楼层 |阅读模式
:本文仅供初学者参阅,解惑


  • 在C步伐中:
与步伐代码外的数据(文件)打交道,我们利用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换。
——文件流:C标准库提供了FILE(之以是定名为FILE,由于linux将全部机制都视为文件) ,FILE对象是一个包含了管理流所需的全部信息的布局,包罗缓冲区信息、各种标志(如文件竣事标志和错误标志)以及用于实际I/O的文 件形貌符等。
——输入流,输入流:数据从文件传送到内存的叫输入流,数据从内存传送到文件的叫输入流。
——打开文件:FILE对象通过调用fopen函数创建的。如: FILE *fp, fp=fopen("filename","r"), 体现以只读的方式创建与filename相干的文件流;filename为当前目次下的相对路径名,r代表可读(打开文件的模式)。

一:读取
1:对一些有规范格式文件的读取,可利用标准库stdio.h下的fscanf函数,
函数原型为:int fscanf(FILE * stream, const char * format, [argument...])
如读取文件data.txt(数据格式相对规范)

代码实现读取:
  1. //test.c//文件读取  #include    int main()  {    //1:创建文件流,文件指针名=fopen(文件名,利用文件方式)打开失败则返回NULL;    FILE *fp=fopen("./data.txt","r"); //以data.txt文件为例    //2:检测文件是否打开乐成;    if(!fp){       printf("打开失败!\n");       return -1; //返回非常    }    //3:    int num; //用来储存一个整型数据    char name[10], place[10]; //用来储存两个字符串数据    //抽象明确:    //明确文件位置寄义:其体现已打开文件当前可读写字符的位置,其体现为一个到文件头的整数;    //fscanf在读取数据时可以如许明确:文件被打开后,它就成了一个无序字节省(水流),其会通过一个管道,流向被读取的一端;    //相识fscanf后知道,其遇到空格字符(空格,制表符),换行符,就会制止,这里的制止我们可以明确为:    //停下来为文件中两个不相干的数据块做一个分隔的利用,刚好顺应了我们一样平常将空字符(包罗换行符)作为两个数据之间的分隔的举动;    //我们只需明确管道的两端    //流进管道的一端的位置,就是文件的位置,体现已被读到的位置。    //流出管道一端,就是进程用来读取数据的一端,其可以对管道中已经做区分的数据举行读取。      //4:读取:    fscanf(fp,"%d%s%s",&num, name,place); //fscanf对流的格式化读取。    //注1:fscanf(fp,"%da%s%s",&num,name,place); 可以实现对数据:1a小刚 河南;的正确读取,体现两个数据之间以a为界。    //注2:由于流是指针的性子,以是函数是将各数据块的首地址交给对应参数,以是num需举行&取地址利用,    //注3:由于name,place自己已表达地址,以是不消改变;    fscanf(fp,"\n");    //\n为控制字符,此时文件的位置到了第二行的开始;    //接着举行利用:fscanf(fp,"%d%s%s",&num, name,place);就可以继承读取第二行    //以是我们经常只需利用一个while语句就可以将整个文件读取到一个数据布局(进程)中    /*    while(!feof(fp)) //feof()检测一个文件是否竣事,即到达文件尾,若竣事,则返回非0值,否则返回0    {       fscanf(fp,"%d%s%s\n",&num, name,place);     }    */     //检测读取结果    printf("%d %s %s\n",num, name, place);     //关闭流    fclose(fp);         return 0; }
复制代码
步伐运行结果:


2:从文件中读取整行数据(标准库stdio.h下的fgets
函数原型:char *fgets(char *str, int n, FILE *stream);
其从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,大概读取到换行符时,大概到达文件末端时,它会制止,遇到空格不绝止;
例从文件中读取一行数据:

代码实现:
  1. //test3.c//行读取文件数据#include#define maxlen 30int main(){    //创建文件流    FILE *fp=fopen("./data.txt","r");        //2:检测文件是否打开乐成;    if(!fp){       printf("打开失败!\n");       return -1; //返回非常    }    char str[maxlen];//缓冲区,用来储存数据    //从文件中读取一行数据,储存到str开始的地址,最大长度为maxlen,然后下次读取从下行开始    //假如该行的数据长于maxlen-1,则只能返回一个不完备的行,并下次调用时从该处开始    fgets(str,maxlen,fp);    //检测结果    printf("%s\n",str);    //关闭流    fclose(fp);    return 0;}
复制代码
运行结果:



二:生存
1:生存与读取每每相干联,生存格式决定了你读取的方式,利用函数fprintf可以举行指定格式的生存:
函数原型为:int fprintf( FILE *stream, const char *format, [ argument ]...)
假设生存一个人的个人信息到文件中:
  1. /*test2.c *///数据生存#includeint main(){    //例一个人的信息    int num=1;    char name[10]="小明";    char place[10]="河南";    //创建与文件的流    FILE *fp=fopen("./data.txt","w");        //2:检测文件是否打开乐成;    if(!fp){       printf("打开失败!\n");       return -1; //返回非常    }    //将数据格式化输出到指定文件流,int fprintf( FILE *stream, const char *format, [ argument ]...)     //注:此函数,是将format字符串写入到指定输出流中,format包罗空格字符,非空格字符,阐明符之中的一个或多个。如:fprintf(fp," "); 就是将空格输入到流中。    //可明确为进程借助流将数据打印(fprintf)到了文件中;    //将个人信息,写入指定流中,数据间以一个空格分隔,末了还写入换行符(控制字符)。    fprintf(fp,"%d %s %s\n",num, name,place);    //以是经常只要利用一个while语句就可以将讲一个表(链表,顺序表)按指定行格式写入输出流中    /*    while(!feof(fp)) //feof()检测一个文件是否竣事,即到达文件尾,若竣事,则返回非0值,否则返回0    {       fprintf(fp,"%d %s %s\n",num, name,place);     }    */    //关闭流    fclose(fp);    return 0;}
复制代码
运行结果:


2:写一个字符串到流中(fputs),函数原型:int fputs(const char *str, FILE *stream);
例:
  1. //test4.c//生存字符串#includeint main(){    //1:创建文件流,文件指针名=fopen(文件名,利用文件方式)打开失败则返回NULL;    FILE *fp=fopen("./data.txt","a"); //以data.txt文件为例,a体现追加    //2:检测文件是否打开乐成;    if(!fp){       printf("打开失败!\n");       return -1; //返回非常    }    //string    char string[20]="Facing the world";    //write string to the fstream    fputs(string,fp);    //关闭流    fclose(fp);    return 0;}
复制代码
运行结果:



浅谈c++:

在c++中我们可以利用利用符来举行流的读写利用,更加的方便和易于明确;
具体参考下列实例:
1:读取所示数据:

代码实现:
[code]//c++文件读取#include //输入输出流#include //文件流//using namespace std; //若利用该声明,则可以不消在利用的每个标准库的成员前加std::int main(){   //序号,年龄,年;   int num, age, year;   //姓名,地址   char name[20], place[20];   //c++的文件流,ifstream为输入文件流   std::ifstream fp;   //open为ifstream的成员函数,功能为打开文件,并将它与流关联   fp.open("./data.txt",std::ios::in); //ios::in体现读流的方式,体现打开模式。   //成员函数is_open检查流是否有关联文件,即打开乐成与否,乐成返回true,失败返回false   if(!fp.is_open()){       std::coutnum>>year>>age>>name>>place; //利用利用符>>,将数据传输到对应的变量中   //检测   std::cout

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|深圳论坛-深圳人的网上家园  

GMT+8, 2020-6-6 05:53 , Processed in 0.123900 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表