理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

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

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

[复制链接]

9650

主题

9650

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

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


  • 在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|手机版|小黑屋|理想论坛_专业20年的财经股票炒股论坛交流社区 - 股票论坛

GMT+8, 2020-7-5 08:05 , Processed in 0.157941 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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