文件分割的思路,顶者也给分!
【学生成绩信息】 姓名:张三 性别:男 年龄:22 姓名:李四 性别:男 年龄:21 姓名:王丽 性别:女 年龄:20
[解决办法]
ding
[解决办法]
ding...........
[解决办法]
[解决办法]
虽然从没有涉及过,但还是帮顶!
[解决办法]
顶............
[解决办法]
如果是这种小型的文件数据库存储,一般全部直接读出来,再来切分,解析成二维数组,或是hashtable
不需要考虑定位问题的
简单的来做,就是以\n来分隔一条记录,以,来分隔一个字段
形成
xxx,yyy,zzz
aaa,bbb,ccc
这有一个问题,就是如果你存储的内容中有,或是\n就会出错了
因此,这时候,你可以用特定字符,如,E_LINE表示分行,E_COMMA,表示逗号
于是,文本就成
xxxE_COMMAyyyE_COMMAzzzE_COMMAELINEaaaE_COMMAbbbE_COMMAcccE_COMMA
我有做过小型数据库,支持sql查询,原理类似于这样,不过,当然具体会复杂很多,
[解决办法]
PYTHON做就简单多了。。
[解决办法]
[code=C/C++][/code]
//
//=============================================
//对INI文件进行分割,默认以"="号分开,无新类
//返回分割个数
int CGkFile::IniSeparate(CStringArray* strapItemStrArr,//整行的内容数组
CString strIgnoreToEnd,//从此字串起,忽略到行尾
CString strSparate//分割字符串
)
{if(fpFileRead==0)return 0;//没文件
int iNowItem=0;//各类当前项目计数
do{
CString strNewLine;
if(1==ReadUntill('\n',&strNewLine))
{fpFileRead->Seek(1,CFile::current);
if(strIgnoreToEnd!=""&&-1!=strNewLine.Find(strIgnoreToEnd))//省略
{strNewLine=strNewLine.Left(strNewLine.Find(strIgnoreToEnd));}
int iEqualMark=strNewLine.Find(strSparate);
if(iEqualMark==-1)continue;//无等号
CString strLeft=strNewLine.Left(++iEqualMark-1);
strLeft.TrimLeft();
strLeft.TrimRight();
CString strRight=strNewLine.Mid(++iEqualMark-1);
strRight.TrimLeft();
strRight.TrimRight();
strapItemStrArr->Add(strLeft);
strapItemStrArr->Add(strRight);//AfxMessageBox(strNewLine.Left(++iEqualMark-1));
}else break;
}while(1);
return iNowItem;
}
[code=C/C++][/code]
[解决办法]
你文件是规范的吗?比如三行是一个块,第一行是姓名,冒号,人名,第二行和第三行是你写的。然后第4行开始是第二个块的话。
char line[20];
fgets(line,20,fp);
然后处理line,以冒号为分隔符,对字符串分隔,注意中文编码是2个字节。
[解决办法]
帮顶,学习~~~~~~~~~~~~~~~~
[解决办法]
帮顶
帮顶
帮顶
帮顶
帮顶
[解决办法]
fread 一次读固定一块,一次读入固定一块(要求文件内容规则),然后编写一个字符串匹配算法。
[解决办法]
先来接分
[解决办法]
写入文件的时候就按照某种格式写入,然后读取时就很容易进行定位了
[解决办法]
帮顶,我学习的是纯C
[解决办法]
typdedef struct {
char name[20];
char gender;//如0代表男,非0代表女
char age;
}TStudent;
不在乎空间和效率的话先定义一个大数组,然后一行行的读,逐个识别学生的三种信息后;用fread一次性读取大块数据效率会高一些,还可以根据实际需要动态创建数组。
[解决办法]
顶什么?
[解决办法]
帮顶,没时间看了,现在自身难保啊
[解决办法]
这个问题其实只要文件格式设置的好很容易就能做到,C++中重载了>>输入运算符,能自动转换类型,跳过空格,回车,制表符
下面这段代码能实现,实现方法较简单,不用进行字符串操作,希望对你有帮助
配置文件格式
person.txt
3//行数
张三 男 22
李四 男 21
王丽 女 20
代码:
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
ifstream fin("person.txt");
if(!fin)
{
cout<<"文件打开失败"<<endl;
return 1;
}
int n=0;
fin>>n;
int a=0;
string name;
string gender;
int year;
cout<<"选择查询操作:"<<endl;
cout<<"1.姓名"<<endl;
cout<<"2.年龄"<<endl;
cout<<"3.性别"<<endl;
cin>>a;
if(a==1)
{
for(int i=0;i<n;i++)
{
fin>>name;
cout<<name<<' ';
fin>>gender;
fin>>year;
}
cout<<endl;
}
if(a==2)
{
for(int i=0;i<n;i++)
{
fin>>name;
fin>>gender;
cout<<gender<<' ';
fin>>year;
}
cout<<endl;
}
if(a==3)
{
for(int i=0;i<n;i++)
{
fin>>name;
fin>>gender;
fin>>year;
cout<<year<<' ';
}
cout<<endl;
}
fin.close();
}
[解决办法]
看看有帮助不。纯C,没有使用第三方库。可惜估计效率比较低。
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_LENGTH 20typedef struct Student{ char name[MAX_LENGTH]; char gender[3]; int age;} Student;int main(void){ int i = 0; char buf[100]; char *tmp = NULL, *content; char *delim = ":"; FILE *fp = fopen("stu.txt", "r"); if (fp == NULL) { printf("file error!\n"); return -1; } fscanf(fp, "%s", buf); while (EOF != fscanf(fp, "%s", buf)) { printf("%s\n", buf); tmp = strtok(buf, delim); do { content = tmp; /*printf("%s\n", tmp);*/ } while (NULL != (tmp = strtok(NULL, delim))); /* 此时content指向的就是分割结果的最后一个(即字段的数据字符串)*/ /* 后面的处理暂时我也想不起来 */ printf("\n"); } fclose(fp); return 0;}
[解决办法]
补充一点
///////////////////////////
if (fp == NULL)
{
printf("file error!\n");
return -1;
}
fscanf(fp, "%s", buf); //这里是跳过第一行的【学生成绩信息】
while (EOF != fscanf(fp, "%s", buf))
{
printf("%s\n", buf);
///////////////////////////
[解决办法]
帮顶吧
[解决办法]
#include <CStdioFile.h>
..
int i=0;
CString str[M][N];
CString line;
CStdioFile file(只读打开);
file.ReadLine(line);
line.
while
[解决办法]
顶............
[解决办法]
支持楼主
[解决办法]
这个向大家学习
[解决办法]
沉下去了,帮人顶一下,呵呵,因为我也想知道
------解决方案--------------------
帮顶的
[解决办法]
这个不会,学习一下!
[解决办法]
好帖子学习
[解决办法]
定义为.ini文件格式读写比较方便
[解决办法]
每天回一帖 有10分!
[解决办法]
新手,学习下
[解决办法]
来学习下