关于读取TXT数据

johnlove9527 2010-12-02 12:00:17
我想要读取一个TXT文件里数据,数据为3列。如下格式
100 500 5
101 500 4
102 500 5
...
100 501 3
101 501 5
102 501 4
...
依次类推,数据比较多。
现在我是想建个二维数组譬如说
data[m][n],data是结构体
{
int x;
int y;
int z;
}
这种类似的,但是现在我不知道这个数据多少行多少列,请问有什么解决方法吗?
如果说就例子而言,第一列数据始终从100到150,第二列数据有假如50个一样然后就依次增加1。请问如何写判断代码呢?
我自己写了个代码但是运行错误

char x;//一个字符
CString ss;//一个字符串形式的坐标
int count=0;//纪录读进来的数,好化分为X,Y,Z
double value=0.0; //暂时存储读入的数值
int rownumber=0; //暂时存储读入行数;
int mx=0;
int my=0;
int znum=2;
while(!fout.eof())
{
fout.read(&x,1);
if (x==' ' || (int)x==9 || (int)x==10)
{
if (ss!="")
{
value=atof(ss);//转换成double
count=count+1;
if(count%3==0)
{
demn[mx][my].z=value;
rownumber++;
my=rownumber;
}
if(count%3==2)
{
demn[mx][my].y=value;
}
if(count%3==1)
{
demn[mx][my].x=value;
}

if(my==2&&mx==0)
{
m_xjiange=demn[mx][my-1].x-demn[mx][my-2].x;

}
if(my>1)
{
if(demn[mx][my-1].y==demn[mx][my-2].y && demn[mx][my].y==demn[mx][my-1].y)
{
znum++;
// AfxMessageBox("1");
}
else
{
my=m_ylieshu;
if(mx==2)
{
m_yjiange=demn[mx-1][my].y-demn[mx-2][my].y;
}
mx++;
}
}
}
ss="";
}
else
{
if (x!='"' && x!=' ')
ss=ss+x;

}

}
如果能帮我修改代码也行,谢谢了。
...全文
264 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
masktime 2010-12-12
  • 打赏
  • 举报
回复
学习,也在关注。
CStdioFile::ReadString();
貌似做过。
johnlove9527 2010-12-03
  • 打赏
  • 举报
回复
对于数组我是这么定义的

demn=new node*[1000];
for(int n=0;n<1000;n++)
{
demn[n]=new node[1000];
for(int nn=0; nn<1000; nn++)
demn[n][nn].x=0;
demn[n][nn].y=0;
demn[n][nn].z=0; //初始化
}


在头文件处声明
//定义坐标结构
typedef struct node
{
double x;
double y;
double z;

}node;
node **demn;

是这里的问题吗?
johnlove9527 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 whrspsoft3723 的回复:]
大概多少行啊? 上边的那几种结构都可以。
[/Quote]

数据大概是441*517。不多啊。我是思路是二维数组[1000][1000]里边读取便判断第二列数据一变化就换行存储,
数据为3列。如下格式
100 500 5
101 500 4
102 500 5
...
100 501 3
101 501 5
102 501 4

最后形成一个441*518的数据,比原来的多了一列。但是读取非常卡。如果有需要我可以贴下代码。
whrspsoft3723 2010-12-02
  • 打赏
  • 举报
回复
上边已经说得清楚了。vector

行数一行一行读,读完你就知道了。 用vector或CObArray,CPtrArray似乎都可以。
列数如何判断,跟你的数据有关系。 也不必要定死列数吧,也可以是动态的。

johnlove9527 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualeleven 的回复:]
CStdioFile::ReadString();
[/Quote]

我现在知道如何读取数据,关键是我想判断来存储这个数据需要的数组的行数和列数。数据我已经读出来了。呵呵
johnlove9527 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
vector
按行读,然后分解成数字
[/Quote]

现在数据比较好是整形,如果是不知道数据长度,而且我想知道是如何确定行数和列数,我的想法是通过判断第二列的数据,看有多少个数据一样就输出一个int数目来确定行数,再读取所有行数,来与列数相除来确定行数。
Eleven 2010-12-02
  • 打赏
  • 举报
回复
CStdioFile::ReadString();
ouyh12345 2010-12-02
  • 打赏
  • 举报
回复
vector
按行读,然后分解成数字
whrspsoft3723 2010-12-02
  • 打赏
  • 举报
回复
大概多少行啊? 上边的那几种结构都可以。
johnlove9527 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jhayumu 的回复:]
vector,上面已经说的很清楚了
不过数据量太大的话,vector 会失败
[/Quote]

我刚重新调了代码,出现了读取TXT非常卡的情况,运行出现 内存不足

调试出现 Heap block at 00037EC8 modified at 0003DCC0 past requested size of 5df0

Call Stack
出现如下错误
NTDLL! 7c92120e()
NTDLL! 7c97f3b4()
NTDLL! 7c98e52f()
NTDLL! 7c982318()
KERNEL32! 7c85eb5f()


9命啊。感觉是多循环了,导致系统崩溃。
jhayumu 2010-12-02
  • 打赏
  • 举报
回复
vector,上面已经说的很清楚了
不过数据量太大的话,vector 会失败
johnlove9527 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 allenbein 的回复:]
1、用可动态扩展的容器来做,Vector 、List、Deque等等都可以
2、自己创建动态数组,自己分配内存来做
[/Quote]

我用了vector后,因为打开data.txt使用ifstream fout;
然后头文件添加了
#include<stdio.h>
#include<vector>
#include <iostream>
#include "fstream.h"
#include "stdio.h"

using namespace std;

出现了'ifstream' : ambiguous symbol
'cout' : ambiguous symbol之类错误
请问头文件怎么改啊?怎么回事?
johnlove9527 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 allenbein 的回复:]
1、用可动态扩展的容器来做,Vector 、List、Deque等等都可以
2、自己创建动态数组,自己分配内存来做
[/Quote]

原本打算在一个二维数组[1000][1000]里边读取便判断第二列数据一变化就换行存储。但是搞了好长时间发现逻辑上有点不顺,就想问问这个思路可行不?不行就换vector了。
如果不行就只能换成两个阶段做,先判断读入数据的行数和列数,再依次存储到二维数组里。
allenbein 2010-12-02
  • 打赏
  • 举报
回复
1、用可动态扩展的容器来做,Vector 、List、Deque等等都可以
2、自己创建动态数组,自己分配内存来做
johnlove9527 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 whrspsoft3723 的回复:]
上边已经说得清楚了。vector

行数一行一行读,读完你就知道了。 用vector或CObArray,CPtrArray似乎都可以。
列数如何判断,跟你的数据有关系。 也不必要定死列数吧,也可以是动态的。
[/Quote]

我不知道行数和列数,vector貌似也是自己定义长度把?而且这个数据不是一点点,估计1000*1000这么多,因为我是将地形划分了网格所以数据多但是有规律,而之所以我要知道列数,是因为方便我用二维数组处理他。如果vector可以那怎么判断未知的有规律的数据的行数和列数呢?
lyingbo 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 whrspsoft3723 的回复:]
上边已经说得清楚了。vector

行数一行一行读,读完你就知道了。 用vector或CObArray,CPtrArray似乎都可以。
列数如何判断,跟你的数据有关系。 也不必要定死列数吧,也可以是动态的。
[/Quote]

+1

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧