C++小白求大神提携解惑,是在搞不明白了

我有一个数据文件,里面的格式是自己定义的
###################begin##line############################
[C 1 1] [C 1 7] [C 1 8] [C 2 2] [C 2 5] [C 2 6] [C 2 7] [C 2 8] [C 3 3] [C 3 4] [C 3 5] [C 4 4] [C 5 5] [C 6 6] [C 6 7] [C 7 7] [C 8 8]
####################end##line############################
我有下面的问题,想请某位大神指点一下:
1. 我读取文件时,不知道文件有多少行,上面只是一行样本,还有很多行,每一行也不知道有多少“[c int int]”这样的配对,因为int不知道有多大,应该用什么结构存储;
2. 读取时有没有什么快捷的读取方式,我最终想获取的是“[ ]”里那两个int的值。

小弟不胜感激!大拜!

c++

8个回答

如果知道每行的最大长度,可以试试

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
char buffer[MAX_LENGTH+1];
int main(){
    FILE *fp = fopen(?, "r");
        vector<vector<item*>*> *vv = new vector<vector<item*>*>();
    while(feof(fp) == 0){
            vector<item*> *v = new vector<item*>();
        fgets(buffer, MAX_LENGTH+1, fp);
            char *pch = strtok(buffer, " []C");
                long temp = atol(pch);
                pch = strtok(buffer, " []C");
                v->push_back(new item(temp, atol(pch));
        while(pch != NULL){
                    pch = strtok(buffer, " []C");
                    temp = atol(pch);
                pch = strtok(buffer, " []C");
                    v->push_back(new item(temp, atol(pch));
                }
                vv->push_back(v);
        }
}

Firas
平菓菓 少include了cstdlib,main漏了return 0;
接近 6 年之前 回复

如果文件不是GB级别,而是最多几百MB,可以完全读到内存中用String.Split函数切割。

如果确定是按照一定格式写的比如用的fprintf,则可以对应用fscanf。当然如果数据量不大,还是建议在内存中做吧不容易出错。

GYZDBDX
GYZDBDX 我是按照一定格式输出的(spanresult<<"[C "<< it->first.beg <<" "<< it->first.end<<"]\t";),可是fscanf遇到空格或换行就结束了,小白不知道怎么用啊
接近 6 年之前 回复
GYZDBDX
GYZDBDX 我是定义了一个struct item {int,int},和一个vector<vector<item> > span; 主要问题就是每一行数据处理时怎么比较快的读出数据
接近 6 年之前 回复

如果不确定数据文件的大小,但可以确定每行数据不大于某个值,如 65535 时,可以考虑:
1,先对文件扫描,获取每一行的数据;
2,对获取到的一行的数据进行分析,按 “[ ]”来分析是可以的。

读取来的数据如果有保存,建议为每一行动态分析内存。如果要这样做,需要先扫描一行看看有什么个数据,如扫描有什么个 [。

建立一个struct data{char type,int left,int right};
逐行扫描,把每一个[]内的数据扫描到一个data中。 考虑使用链表存储数据。

GYZDBDX
GYZDBDX 我是用vector存的,struct item {int,int},和一个vector<vector<item> > span,就是逐行扫描是应该怎么处理数据,我最终也就是要得到那两个int
接近 6 年之前 回复
GYZDBDX
GYZDBDX 那个“C”是没用的
接近 6 年之前 回复

上面的回答漏了#include 和main函数的return 0;
@CSDN,回答不能编辑不能删除,这是什么意思?

或者

#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
char buffer[16];
int main(){
    FILE *fp = fopen(?, "r");
    vector<vector<item*>*> *vv = new vector<vector<item*>*>();
        vector<item*> *v = NULL;
        unsigned index = 0, count = 0;
        long temp;
        char c = 0, prev = 0;
        while((c=fgetc(fp))!=EOF){
            if(c == '\r' || c == '\n'){
                    v = NULL;
            }else if(v==NULL){
                    v = new vector<item*>();
                }
            if((c < '0' || c > '9') && prev >= '0' && prev <= '9' ){
                    buffer[index] = 0;
                        index = 0;
                        if(count % 2){
                            v->push_back(new item(temp, atol(buffer));
                        }else{
                            temp = atol(buffer);
                        }
                }else{
                    buffer[index++] = c;
                }
                prev = c;
        }
    return 0;
}
Firas
平菓菓 在if(c=='\r' || c=='\n'){之后v=NULL之前要加一句vv->push_back(v);
接近 6 年之前 回复

嗯,每一行的长度不知道,但是昨天我编出来了,和你的代码差不多,我没有释放内存,分享一下:

#include
#include
#include
#include
#include
#include
using namespace std;
struct item
{
int beg;
int end;
};
vector> span_info;
vector token_temp(const string& src);
vector span_extract(vector stl);

int _tmain(int argc, _TCHAR* argv[])
{
ifstream src_in;
string buffer_src;
src_in.open("span.txt",ios::in);
if(!src_in)
cout<<"Error: No Such File,Please Check"< while(getline(src_in,buffer_src))
{
vector Imresult = token_temp(buffer_src);
span_info.push_back(span_extract(Imresult));
}
return 0;
}
vector token_temp(const string& src)
{
vector temp;
char cstr,*p;
cstr = new char [src.size()+1];
strcpy (cstr, src.c_str());
p = strtok(cstr,"\t");
while(p != NULL)
{
temp.push_back(p);
p = strtok(NULL,"\t");
}
return temp;
}
vector span_extract(vector<char
> stl)
{
vector relace;
int ptr = 0 ,ibeg,iend;
item data;
char* prim,*beg,*end;
for(int i = 0; i < stl.size(); i ++)
{
prim = stl[i];
ptr = strlen(prim);
prim[ptr - 1]='\0';
prim ++;
beg = strtok(prim," ");
end = strtok(NULL," ");
ibeg = atoi(beg);
iend = atoi(end);
data.beg = ibeg;
data.end = iend;
relace.push_back(data);
}
return relace;
}

GYZDBDX
GYZDBDX 漏掉了好多头文件
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问