我想实现这样子的一个功能:
TempCode里存放一个三位数的编码,我想让他变成指定的六位数的编码Code。
指定编码的对照表是一个文件。
例子:
编码对照表:TempCode Code
001 321456
123 121245
564 465025
452 546987
请问要怎么实现~?
TempCode里存放一个三位数的编码,我想让他变成指定的六位数的编码Code。
指定编码的对照表是一个文件。
例子:
编码对照表:TempCode Code
001 321456
123 121245
564 465025
452 546987
请问要怎么实现~?
就是我要在程序中实现这个用户输入TempCode后,我要把它通过这个对照表转换成这个六位的Code
如:用户输入的TempCode为123,则要通过查找这个文件得到这个真实的Code为121245,再把这个121245传回程序的变量Code中。
另一个方法是用STL的数据类型vector,我也不是很熟,不清楚处理大数据怎么样,如果可以,那一定是很方便的。去看一下手册。
user input tempcode
you can get tempcode_code[tempcode]
如果tempcode不止是数字你可以将其转换成为ascii的值进行计算。
我主要就是不知道怎么样读取文件内容并找到我想要的真实Code值。
mostneed兄,你能不能直接把这段程序写出来呀~?
三位数全部(000-999)也只有 1000种,最多占用内存
1000*2*4=8000字节,不大,可以用数组
int map[1000][2];
就可以。如果您使用CMap会更好.
就是字符串操作阿,像上面说的那样,如果各组之间用分号分隔,那么每次把每组的前一个数和输入比较,如果相同,就返回空格后面的字符串。
对,就是这个~!问题是怎么实现!??!?! 例如我存放表的文件是code.txt 用空格进行分离,像这样子
001 321456
123 121245
564 465025
452 546987
例如我存放表的文件是code.txt 用空格进行分离,像这样子
321456 001
121245 123
465025
546987 452
读取code.txt,先查tempcode,把空格作为字符串的结束,与你的输入相比较,看是不是一样。如果一样,那么就让程序继续读取空格后面的字符串,碰到分号就结束,这样,就可以返回code。 如果不一样,则查找下一个分号,然后取得分号后面的字符串。循环。
具体的读文件和比较字符串的操作应该回了吧?已经说得很清楚了
读取code.txt,先查tempcode,把空格作为字符串的结束,与你的输入相比较,看是不是一样。如果一样,那么就让程序继续读取空格后面的字符串,碰到分号就结束,这样,就可以返回code。 如果不一样,则查找下一个分号,然后取得分号后面的字符串。循环。
具体的读文件和比较字符串的操作应该回了吧?已经说得很清楚了说对了~就是因为具体怎么读文件及比较字符串我不会~不是说我不知道函数是什么,而是说我不知道像你刚刚上面说的这样子具体要怎么写~
并转换成int类型。
要知道
在内存中找一个数,比在磁盘上找一个数快N个数量级。
比较int的大小比比较string的大小快N个数量级!
强烈建议将文件内容读入内存,
并转换成int类型。
要知道
在内存中找一个数,比在磁盘上找一个数快N个数量级。
比较int的大小比比较string的大小快N个数量级!说得不错~问题是怎么读呀~?
最关键问题就在这里我不会,如果是一个数组,fopen文件后,读文件时怎么样把前面三位数的读到一个前标变量,而将空格后的六位数读到下标变量~?然后读完后用循球进行比较这些都不是问题~~?
可以直接定义成二进制文件,
不要用文本类型。
您就可以
CStdioFile file;
file.Open("文件名",modeRead|typeBinaray);//用二进制只读打开
long map[1000][2];
int len=file.GetLenght();//文件长度
file.Read(map,len);//读数据
file.Close();//关闭文件
这样子的话也可以, 你能不能具体把这一段代码写出来~?
您可以用
int data[1000][2];
int num;//对照表个数
while(num=0;!feof(file);num++)
{
sscanf(fp,"%d",data[i][0]);//从文本格式读入整数
sscanf(fp,"%d",data[i][1]);
}
file.Open("文件名",modeRead|typeBinaray);//用二进制只读打开
long map[1000][2];
int len=file.GetLenght();//文件长度
file.Read(map,len);//读数据
file.Close();//关闭文件
file.Read(map,len)这个能够把这个文件的内容全部读到map这个数组么?就是说map[1][1]为TempCode,map[1][2]为Code?我的那个二进制文件应该怎么写?
&data[num][0]和 &data[num][1]
CStdioFile file;
file.Open("文件名",modeWrite|typeBinaray);//用二进制写打开
long map[][2]={{123,123456},{345,908765},....};//假设您已经有数据
file.Write(map,sizeof(map));//写数据
file.Close();//关闭文件
int data[1000][2];
int num;//对照表个数
while(num=0;!feof(file);num++)
{
sscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
sscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
}
应该 fscanf
int data[1000][2];
int num;//对照表个数
while(num=0;!feof(file);num++)
{
sscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
sscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
}
按你这个读的话,它能识别空格前的读到data[i][0],空格后的读到data[i][1]吗?
反正就这几个函数.
如果使用 fscanf,对应的写是
fprintf
int data[1000][2];
int num;//对照表个数
while(num=0;!feof(file);num++)
{
fscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
fscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
}
按你这个读的话,它能识别空格前的读到data[i][0],空格后的读到data[i][1]吗?
和scanf和printf是一致的,只是多一个文件指针的参数.
{
fscanf(fp,"%d",&data[i][0]);//这个是读TempCode吗?
fscanf(fp,"%d",&data[i][1]);// 这个是读Code吗?
}
按你这个读的话,它能识别空格前的读到data[i][0],空格后的读到data[i][1]吗?并且读完一行后他能读下一行吗/
能不能告诉我啊?如果可以的话,我就结贴了。
char x[3];
char y[6];
};main()
{struct code cod[1000];
FILE *fp;
char* str;
char s;
int i,j;
int pair=0;/*这是代码是否成对的标识,用来控制数组的输入.*/
if((fp=fopen("filename","r"))==NULL)
{printf("error");
exit(0);
}
for(i=0;s!=EOF;)
{str=NULL;
s=fgetc(fp);
while(s!='')
{ strcpy(str,s);
s=fgetc(fp);
}
if(strlen(str)==3)
{ pair=0;
for(j=0;(cod[i].x[j]=str++)!='\0';j++)
}
else
if(strlen(str)==6)
{ i+=pair;
for(j=0;(cod[i].y[j]=str++)!='\0';j++)
{}
pair=1;
}
}
}如果哪些地方不明白请再发贴,
如果有些作用请照顾一下我的专家分...:)
{
FILE* fp;
fp=fopen("f:\\data.txt","r");
int data[1000][2];
int num;//对照表个数
for(num=0;!feof(fp);num++)
{
fscanf(fp,"%d",&data[num][0]);//这个是读TempCode吗?
fscanf(fp,"%d",&data[num][1]);// 这个是读Code吗?
}
int i;
for(i=0;i<num;i++)
{
printf("\n X=%d\t Y=%d",data[i][0],data[i][1]);
}
fclose(fp);
return 0;
}文件 data.txt123 456000
223 987654
334 9987运行结果 X=123 Y=456000
X=223 Y=987654
X=334 Y=9987
下列类用来将整数表示为二进制的字符串,例如3转换成"0000000000000011",
请为该类重载+,-,INT运算符,并实现已经定义的两个构造函数.
class Binary{
char bits[16];
public:
Binary (char *);
Binary (int);
}
/* 如:
001 321456
123 121245
564 465025
452 546987
其中第一行的长度为{001 321456}的长度
*/main(int argc, char *argv[])
{
// argv[1]中存储的是你要查询的代码,如001,123等等
char *szCode=argv[1];
// 用于存储每一个CODE对应行的字符串
char szLine[MAX_LINE_SIZE];
// 返回的对应码;
char szReturn[6+1]; ifstream in("code.dat");
while (!in.eof())
{
in>>szLine;
if (szReturn=GetCodeMap(szLine, szCode)) break;
} cout<<szCode<<" "<<szReturn<<"\n"; return 0;
}
吓了我一跳,以为白辛苦了,还好平安的贴上来了.
程序是读字符串文件的,以前写过一个类似的文件通过了,
今天大脑有点木,也许会有不妥的地方,希望对楼主有帮助就行了.iicup(双杯献酒) 你的程序好像并没有考虑楼主说的一种情况:
就是6位码是唯一的,要是出现连续的两个6位码你的程序会出错的.
而文本文件仅仅适合(方便)人员阅读。所以,我仍然强烈建议您不要害怕二进制的文件操作。
去熟悉它,您会觉得他很可爱。
另外,现在更新的文件操作方式(一般也就更先进)是
用流(iostream)和类(CFile),您应该努力尽量使用新的技术。
上面的程序并没有测试,
能帮忙测试一下吗?我在网吧,没有工具~麻烦你了。
你的这个程序我看不太懂~呵呵~
tbyte,
tword,
tdword,
tbytearray //这是一个字符数组,作用就更不用说了:)
123 456000
223 987654
456 987654
334 799879运行结果
123 456000
223 987654
456 987654
334 799879
##################################
# 整个程序就下面这么多
# 假设我们给这个脚本起个名字叫GetCodeMap[1] #!/bin/bash
[2] IFS=" " #设置空格为间隔符
[3] while read tempCode Code
[4] do
[5] if [tempCode==$1]; then
[6] echo $Code
[7] exit
[8] if
[9] done#OVER~
######################################
哇噻~~~一起9行代码,不到10行代码就解决问题了!
爽不爽?:) 还包括了注释代码、为了方便的换行:)接下来就是如何使用问题,很简单
$ ./GetCodeMap 001 < code.dat
或者
$ cat code.dat | GetCodeMap输出结果都会是321456升级!
为了防止二义性的出现,建议你将code.dat文件改为
001:321456
123:121245
564:465025
452:546987
……这样,以上的GetCodeMap文件改为如下:[1] #!/bin/bash
[2] IFS=: #设置":"为间隔符
[3] while read tempCode Code
[4] do
[5] if [tempCode==$1]; then
[6] echo $Code
[7] exit
[8] if
[9] done
例如我存放表的文件是code.txt 用空格进行分离,像这样子
321456 001
121245 123
465025
546987 452
iicup(双杯献酒) 就是这样的情况. 读数据的时候是以空格来作为
标志判断是否是一个数据段的. 而数据是二个二个对应起来的.
465025 546987 你如果不判断的话是否会成为对应关系?
即结果会出现
321456 001
121245 123
465025 546987
452 ...楼主....5555....好像也不能帮你做测试了.
我的情况跟你差不多,手头没有工具.万分报歉.