用c++读取txt文件,并存储到数组中。

现在的.txt文件是这样的(如下),名字叫transaction.txt, 第一列是序号,这个文件里有两万多组。第二列不同数据间用逗号隔开,而且每条记录的长度不固定(有的两个数字,有的三个,有的二十多个)。
我现在在用visual studio2008,请问怎么能将这两列数据分别读入到两个数组中,方便以后对这些数据的分析和操作?

谢谢!

1 77,310,533,1392
2 154,360,1196,1242
3 181,963,1306,1383
4 337,1512
5 483
6 327,377,653,942
7 218,927,1449,1493
8 826,886,1003
9 726,1302,1545
10 603,623,959
11 281,763
12 243,809,1091,1231
13 379,1055,1211
14 79,375,1017,1155,1177,1221,1437
。。。。。。

0x20是空格,0x2c是逗号,0x0D0A是换行符
碰到空格,空格前的字符入栈A,碰到逗号或者换行,这之前的数字入栈B
再就是用一个char接收每次读取的字符,然后用一个缓冲区把这个字符添加到结尾,当碰到0x20时候,缓冲区把值转换为数字,把数字入栈A,然后再这样一次读一个字节,当遇见0x2c或者0x0d0a时候,把前面的缓冲区的字符转换为数字存储入栈B,这样应该就行了,(每次读一字节,当读到0d时,文件指针向后移动一个字节跳过读取0a,因为只要出现0d就能确定一定是换行)
这个题目的难点,应该就在于判断哪一类数字归为一类,而明显的
用空格分开的是一类,用逗号或者回车符分开的是另外一类
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-08-30
以下代码在visual studio2008下测试成功,另外,给楼主一个建议:为了能更方便地操作数据,建议别把数据存在两个数组中。由于你的第一列是序号,具有唯一性,因此可以将它们存在一个map中。代码如下:

//////////////////////////////////////////////////////////////////////////
//
// 说明:为了能更方便地操作数据,我建议别把数据存在两个数组中。由于你的第一
// 列是序号,具有唯一性,因此可以将它们存在一个map中

#include <fstream>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <vector>
#include <map>

using namespace std;

int main()
{
std::ifstream in("transaction.txt");
if (!in) { cerr << "打开文件transaction.txt读取数据错误" << endl; return 1; }

typedef vector<int> IntVec;
map<int, IntVec> iIntVecMap; // 记录信息,每条记录对应文件中的一行
string szRcdInfo;
char buffer[500]; // 根据行数据的最大个数调整数据的大小
int iXuhao;
while (in.getline(buffer, 500))
{
szRcdInfo = buffer;
int index = szRcdInfo.find(" "); // 查找空格,以便读取序号列
if (index == -1) { cerr << "数据格式错误" << endl; return 1; }

iXuhao = atoi(szRcdInfo.substr(0, index).c_str()); // 读取序号
int index2;
IntVec intVec;
while(index != -1) // 读取其对应的数据
{
int iData = 0;
index2 = szRcdInfo.find(',', index+1);
if (index2 != -1)
iData = atoi(szRcdInfo.substr(index+1, index2-index).c_str());
else
iData = atoi(szRcdInfo.substr(index+1, szRcdInfo.length()-index).c_str());
intVec.push_back(iData);
index = index2;
}
iIntVecMap[iXuhao] = intVec; // 插入到信息记录中
}

// 输出,观察是否正确. 已测试成功
for (map<int, IntVec>::iterator mapIt = iIntVecMap.begin(); mapIt != iIntVecMap.end(); ++mapIt)
{
cout << mapIt->first << " ";
IntVec &intVec = mapIt->second;
for (IntVec::iterator vecIt = intVec.begin(); vecIt != intVec.end(); ++vecIt)
{
cout << ", " << *vecIt;
}
cout << endl;
}

return 0;
}

在我电脑上的测试结果:
1 , 77, 310, 533, 1392
2 , 154, 360, 1196, 1242
3 , 181, 963, 1306, 1383
4 , 337, 1512
5 , 483
6 , 327, 377, 653, 942
7 , 218, 927, 1449, 1493
8 , 826, 886, 1003
9 , 726, 1302, 1545
10 , 603, 623, 959
11 , 281, 763
12 , 243, 809, 1091, 1231
13 , 379, 1055, 1211
14 , 79, 375, 1017, 1155, 1177, 1221, 1437
第2个回答  2010-08-30
#include<iostream>
#include<fstream>

using namespace std;

int main() {

ifstream myFile;
myFile.open("transaction.txt");
char output[100];
if (myFile.is_open()) {
while (!myFile.eof()) {
myFile >> output;
cout<<output;
}
}
myFile.close();
return 0;
}

楼主也可以用getline()读入string然后用atoi转换成int本回答被提问者采纳
第3个回答  2010-08-30
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
void main(){
char ch[100] = "\0";
char a[100][100],b[100][100];
int x=0,y=0;
ifstream fin("transaction.txt",ios::in);
fin.getline(ch,100);
while(!fin.eof()){
cout<<ch<<endl;
char *result = NULL;
result = strtok(ch," ");
strcpy(a[x++],result);
cout<<a[x-1]<<endl;
result = strtok(NULL,",");

while( result != NULL ) {
strcpy(b[y++],result);
cout<<b[y-1]<<endl;
result = strtok( NULL, "," );
}
memset(ch,0,100);
fin.getline(ch,100);
}
fin.close();
/* for(int i=0;i<14;i++)
{
cout<<"a "<<a[i]<<" b "<<b[i]<<endl;
}*/
}
//已运行过了,没问题

C++ 从TXT文件中读取数据存到数组中??你是怎么解决的谢谢
文件中读取数据存到数组中的命令:include <fstream> void main()nclude <stdio.h> include <math.h> define MaxLength { int a[10];ifstream fin("D:\/我的输入文件.txt");for(int i=0;i<10;i++)fin>>a[i];for(int i=0;i<10;i++)cout<<a[i]<<endl;ofstream fout("D:\/我的...

C\/C++如何读取TXT文件的行数和把TXT文件的内容存到数组中
C语言读取TXT文件的行数并把把TXT文件的内容存到数组中,需要根据每行的内容(字符,数字,字符串)选取fgets、fscanf或者fgets。这里假设每行是一个字符串,每行不超过127个字符(用数组存字符串,最后一位存'\\0'),选取fgets进行读取。示例代码如下:include <stdio.h>#include <stdlib.h>int main...

请问C++ 如何从txt文件中读取数据,然后保存在类的数组中?
while(!File_read.eof()){ File_read>>data[i].num>>data[i].name>>data[i].score;i++;} 数组data是的类型是信息类。自己试试。

VC++,读取txt文件数据,并存入数组中。
include <iostream> using namespace std;define FRISTCLM 30000 define SECONDCLM 8 \/\/参数 Filename 为要读的文件名,如:readdd.txt 。int ReadFileToBUF(char * Filename,int bufdd[][SECONDCLM],int len){ FILE *fp=fopen(Filename,"r");if(fp == NULL)return 0;char buf[256],num...

C++如何一行一行读取txt文件中数据并存入相应数组?
循环读入。c 程序 可作为 c++程序。include<iostream> include<fstream> using namespace std;include <stdio.h> main(){ int x[5],y[5];int i;FILE *fp;fp=fopen("sk.txt","r");for (i=0;i<5;i++) fscanf(fp,"%d",&x[i]);for (i=0;i<5;i++) fscanf(fp,"%d",&y[i...

C++如何逐行读取txt文件,并将读取出来的数据进行运算导入到另一个文件...
1、首先我们在电脑上新建一个文件夹,名称叫txt2array。然后,打开我们的devc++,新建一个控制台c++项目,名称也叫txt2array。2、将项目文件及源代码文件以及我们演示用的数据文件都存放在txt2array文件夹中。3、向数据文件中写入一些演示用数据。4、读取文件。输入如下代码:运行下,看来我们读取成功了...

用vc++逐行读取文本文件txt里面的数据,并且复制给数组
define MAX 20000 char *srcfile = "data.txt";\/\/文件名 int data[MAX][8];int main(){ FILE *src = fopen(src,"r");int i,j;for(i = 0;i < MAX;i++){ fscanf(srcfile,"%d,%d,%d,%d,%d,%d,%d,%d",&data[i][0],&data[i][1],&data[i][2],&data[i][3],&data...

C++编程读取TXT数据,将其赋值到数组,而后进行计算
include <iostream>#include <cstdio>#define maxn 10000using namespace std;struct m{ int x; int y; int z;}a[maxn];int main(){ freopen("\/*文件名*\/","r"\/*代表读取*\/,stdin);\/\/从此以后所有读取都会从此文件读 for(int i=0;i!=maxn;i++){ cin>>a[i]...

C++如何在文件中读取数据,然后保存在一个数组中
using namespace std;void main(){ int s[5][2];ifstream fin("a.txt");int x;fin>>x;for(int i=1;i<x;i++){ for(int j=1;j<2;j++){ fin>>s[i][j];} } ofstream fout("input.txt");fout<<x;for(int k=1;k<k;k++){ for(int t=1;t<2;t++){ fout<...

C++如何按行读入TXT文件到数组
std;const int nLen = 101;int main(){ ifstream inobj("a.txt");char t[nLen];while (!inobj.eof()){ inobj.getline(t,nLen-1);cout<<t;} cout<<endl;return 0;} 会将txt中的所有字符在一行里输出,你也可以 cout<<t 的加上 cout<<endl;来行输出。只当给出简单操作吧 ...

相似回答