C++ 怎样在txt文档里按某些信息读取其中的信息?详细要求如下,请给出详细代码,谢谢!

我的文档保存格式如下,文件名output.txt,20100820是日期。
20100820 up:xxxxxx down:yyyyyy (x和y位数不确定)
20100822 up:xxxxxx down:yyyyyy
20100830 up:xxxxxx down:yyyyyy
.....
要求是用一个函数getUp(int year,int mon,int day)返回一条记录中的xxxxxx,
用另外一个函数getdown(int year,int mon,int day)返回一条记录中的yyyyyy。
如getUp(2010,08,20)返回xxxxxx,getdown(2010,08,20)返回yyyyyy。

如果我的文档格式不便于实现函数,也可以按你自己设置的文档格式达到上述功能,谢谢啊!

第1个回答  2010-09-02

#include <stdio.h>

#include <stdlib.h>

#include <string>

#include <vector>

using namespace std;

//记录数据结构

struct DataLine

{

 string dateTime;

 string up;

 string down;

};

//从文件中获取一行数据

void GetLine(FILE *pInFile,string *pInOutLine)

{

 char c = 0;

 if ( NULL == pInOutLine || NULL == pInFile)

 {

  return;

 }

 pInOutLine->clear();

 while ( true )

 {

  fread(&c,1,1,pInFile);

  if ( c != '\n' && ! feof(pInFile) )

  {

   pInOutLine->push_back(c);

  }

  else

  {

   break;

  }

 }

}

//将一行数据转换为记录数据结构

void TranslateDataStruct(string *pInLine,DataLine *pInOutStruct)

{

 int DateEndPos = 0;

 int UpStartPos = 0;

 int UpEndPos = 0;

 int DownStartPos = 0;

 //下面的两个定义根据你文件中up和down的标志来定义

 //文件中将全角冒号(:)替换为半角冒号(:)

 string UP_FLAG("up:");

 string DOWN_FLAG("down:");

 if ( NULL == pInLine || NULL == pInOutStruct )

 {

  return;

 }

 DateEndPos = pInLine->find(UP_FLAG,0);

 UpStartPos = DateEndPos + UP_FLAG.length();

 UpEndPos = pInLine->find(DOWN_FLAG,UpStartPos);

 DownStartPos = UpEndPos + DOWN_FLAG.length();

 pInOutStruct->dateTime = pInLine->substr(0,DateEndPos-1);

 pInOutStruct->up = pInLine->substr(UpStartPos,UpEndPos - UpStartPos - 1);

 pInOutStruct->down = pInLine->substr(DownStartPos);

}

//获取UP及DOWN

string getUpOrDown(vector<DataLine> *allDatas, int year, int mon, int day, bool isGetUp)

{

 string inDateTime("");

 char tmpSzInDateTime[100];

 if ( NULL == allDatas )

 {

  return string("");

 }

 memset(tmpSzInDateTime,0x0,sizeof(tmpSzInDateTime));

 sprintf(tmpSzInDateTime,"%04d%02d%02d",year,mon,day);

 inDateTime.append(tmpSzInDateTime);

 for ( unsigned long i = 0 ; i < allDatas->size() ; i++ )

 {

  if ( allDatas->at(i).dateTime == inDateTime )

  {

   if ( isGetUp )

   {

    return allDatas->at(i).up;

   }

   else

   {

    return allDatas->at(i).down;

   }

  }

 }

 return string("");

}

void main(void)

{

 vector<DataLine> AllDatas;

 FILE *pFile = NULL;

 string tmpStr("");

 DataLine tmpData;

 

 AllDatas .clear();

 //要将此文本文件中中文全角字符:(冒号)替换为半角字符:(冒号)

 //因为文件中一部分为全角字符,一部分为半角字符处理起来非常不爽(麻烦)

 pFile = fopen("output.txt","rt");

 while ( ! feof(pFile) )

 {

  GetLine(pFile,&tmpStr);

  TranslateDataStruct(&tmpStr,&tmpData);

  AllDatas.push_back(tmpData);

 }

 fclose(pFile);

 int year = 0;

 int month = 0;

 int day = 0;

 int IsQueryUp = false;

 while ( 1 )

 {

  fflush(stdin);

  printf("\n----------------------------------------\n");

  printf("输入你想查询的年(输入0退出) = ");

  scanf("%d",&year);

  fflush(stdin);

  if ( 0 == year ) return;

  printf("输入你想查询的月(输入0退出) = ");

  scanf("%d",&month);

  fflush(stdin);

  if ( 0 == month ) return;

  printf("输入你想查询的日(输入0退出) = ");

  scanf("%d",&day);

  fflush(stdin);

  if ( 0 == day ) return;

  printf("输入想查询UP还是DOWN(1代表UP,0代表DOWN) = ");

  scanf("%d",&IsQueryUp);

  fflush(stdin);

  string GotData = getUpOrDown(&AllDatas,year,month,day,IsQueryUp==0?false:true);

  printf("获取到数据: %s\n----------------------------------------\n",GotData.c_str());

 }

}

用c++如何读取一个txt文档里的坐标点信息.如x=12.25,y=123.35等坐标信息...
include <stdio.h> main(){ FILE *fp;fp=fopen("File_name.txt","r");if(NULL==fp){ printf("Open the file Failed!\\n");} else { printf("Open the file Succeed!\\n");} char ch;\/\/ch = fgetc(fp);while(ch!=EOF){ if ( 'x'==(ch=fgetc(fp))||'y'==(ch=fgetc(fp...

请问C++ 如何从txt文件中读取数据,然后保存在类的数组中?
要声明一个信息(学生)类的数组然后再读文件,读文件大概代码如下:ifstream File_read;while(!File_read.eof()){ File_read>>data[i].num>>data[i].name>>data[i].score;i++;} 数组data是的类型是信息类。自己试试。

编写一个C++程序,进行模式匹配要求如下 可以从一个txt文档中读取...
这个是VC6的,VS2008也差不多:打开VC6,新建工程->MFCAppWizard(exe),假设工程名为Abc->选择SingleDocument,在第4步里点击Advanced,在FileExtension里填上txt,在第6步里,把CAbcView的父类改为CEditView,点Finish即可。这样编译生成的程序已经是一个功能完整的文本编辑器了。

...某一txt文件里面?请给出详细代码(包括头文件)谢谢!
Func : 往文件流out中写入信息,格式为时间:: 内容 \/ void write(ostream &out, const CTime &t){ static int cnt = 0; \/\/ 当前记录条数 CString szTmp;\/\/ 在时间和内容之间插入一标识符::,起分隔作用,方便提取时间对应的内容 szTmp.Format("%s:: 于%s写入 第%i条记录", t.Format("...

在C++的文件读写中,怎么直接从“下一行”开始读取数据?
由于C++处理文件是以流方式处理,要从下一行开始读取,先要能够将文件内部指针移到下一行,可以通过getline处理。istream inf("text.txt", ios::in);char buf[1000]; \/\/ 申请足够放入一行数据的大小 inf.getline(buf, 1000);这时文件内部指针就移到下一行的开始了。

我用DEV-C++编译C代码为什么总是出错?
出的信息就是return的值 在这个程序中,是0 一般main函数都会返回0 以表示运行无误 按照你说的一闪而过 原因是这个程序已经运行完了 所以就关闭掉 1、建议你在生成exe的目录下新建一个txt文档 内容写上cmd \/\/这是用来使用CMD,也就是命令提示符用的 然后保存,改名为cmd.bat \/\/一定要改扩展名 ...

C++课程设计,要求编写<学生籍贯信息记录薄>,请高手帮忙做做._百度知 ...
C++课程设计,要求编写<学生籍贯信息记录薄>,请高手帮忙做做. 50 如题.编制一个学生籍贯信息记录薄,每个学生信息包括:学号,姓名,籍贯.具体功能:1.创建信息链表并以磁盘文件保存;2.读取磁盘文件并显示输出所有学生的籍贯信息;3.按学号或姓名查询其籍贯... 如题.编制一个学生籍贯信息记录薄,每个学生信息包括:学号...

0x00000000指令引用的0x00000000内存,该内存不能为read,怎么回事?
电脑未安装运行环境所导致的无法运行,解决方法:1、按下键盘上的WIN+R进入到“运行”菜单,然后在运行菜单中输入“CMD”进入到命令符窗口。2、当进入到在命令符窗口中后。3、输入下图的命令来修复当前系统损坏的运行环境DLL。4、重新安装环境包。4、修复完毕后,重启电脑,软件报错问题即可解决。

软件开发的一般流程是什么?_?
软件开发流程分为: 需求确认——概要设计——详细设计——编码——单元测试——集成测试——系统测试——维护 软件开发是一项包括需求捕捉、需求分析、设计、实现和测试的系统工程。软件一般是用某种程序设计语言来实现的。通常采用软件开发工具可以进行开发。软件分为系统软件和应用软件,并不只是包括可以在...

c\/c++怎样播放电影
其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下。参数有如下意义:\/u——反注册控件\/s——不管注册成功与否,均不显示提示框\/c——控制台输出\/i——跳过控件的选项进行安装(与注册不同)\/n——不注册控件,此选项必须与\/i选项一起使用执行该命令的方法:1、可以在“开始”--“运行”,调出运行...

相似回答