c++读取并存储格式十分复杂的数据

遇到一个十分棘手的c++数据处理问题具体问题,数据文件是这种类型

img

想把每一列的元素存储到对应类型的数组,然后进行计算重新排序处理,现在无法成功读取每一列对应的元素,导致无法计算,求帮忙读取每一列的元素并将其存储到对应类型的数组中。

```c++
int main()
{
//读取文件中的数据
ifstream ifs; //创建流对象

ifs.open("D://zhao//0725//32处理前.csv", ios::in);    //打开文件

if (!ifs.is_open())                        //判断文件是否打开
{
    cout << "打开文件失败!!!";
    return 0;
}

vector<string> item;        //用于存放文件中的一行数据

string temp;                //临时存储文件中的一行数据

while (getline(ifs, temp))  //利用 getline()读取文件中的每一行,并放入到 item 中
{
    item.push_back(temp);
}

//遍历文件中的每一行数据
for (auto it = item.begin(); it != item.end(); it++)
{
    string str;

    //其作用是把字符串分解为单词(在此处就是把一行数据分为单个数据)
    istringstream istr(*it);                 

    //将字符串流 istr 中的字符读入到 str 字符串中,读取方式是以逗号为分隔符 
    

    string A[9];
    string B[9];
    int j=0;
    for(int i=0;i<1;i++)
    {
        getline(istr, A[i], ',');  
    
    cout << A[i] <<'\t';            // str 对应第一列数据 
    //j++;
    //cout << j<<'\t'; 
    //j++;
    //cin.get();
            
    //cout << j<<'\t'; 
    }
     

    getline(istr, str, ',');                    
    //cout << str << "\t";            // str 对应第二列数据 

    getline(istr, str, ',');                
    //cout << str << "\t";            // str 对应第三列数据   

    getline(istr, str, ',');                
    //cout << str << "\t";            // str 对应第四列数据 

    getline(istr, str, ',');                  
    //cout << str << "\t";            // str 对应第五列数据 

    getline(istr, str, ',');                 
    //cout << str << endl;            // str 对应第六列数据    

    getline(istr, str, ',');                 
    //cout << str << endl;            // str 对应第七列数据   

    getline(istr, str, ',');                 
    //cout << str << endl;            // str 对应第八列数据   

    getline(istr, str, ',');                 
    //cout << str << endl;            // str 对应第九列数据   
}    

system("pause");
return 0;

}
各位,我并不是专业的码农,我的目的是想把各列的数据读取并存入到对应类型的数组或结构体数组方便我计算重新排序用,并不是简单的读取就行了,希望向大家请教

fscanf直接读

#include <stdio.h>

typedef struct record{
    int index;
    char standard[32];
    char name[32];
    int count;
    char material[32];
    float weight;
    float total;
    char code[32];
    char remark[32];
}record;

#define MAX_LINE 1024
static record records_[MAX_LINE];

int main(){
    int ret,i,count;
    FILE* f = fopen("a.csv", "rb");        
    if(!f)return 1;
    for (i = 0; i < MAX_LINE; i++){
        ret = fscanf(f, "%d,%[^,],%[^,],%d,%[^,],%f,%f,%[^,],%[^\r]", &records_[i].index, 
            records_[i].standard, records_[i].name, &records_[i].count, records_[i].material,
            &records_[i].weight, &records_[i].total, records_[i].code, records_[i].remark);
        if(ret == 8)records_[i].remark[0] = 0;
        else if(ret != 9)break;    
    }
    fclose(f);
    count = i;
    printf("csv line count %d\n", count);    
    for (i = 0; i < count; i++){
        printf("csv data: %d,%s,%s,%d,%s,%f,%f,%s,%s\n", records_[i].index, 
            records_[i].standard, records_[i].name, records_[i].count, records_[i].material,
            records_[i].weight, records_[i].total, records_[i].code, records_[i].remark);
    }    
    return 0;
}

参考


你说无法读取,究竟是什么报错信息呢

参考

C/C++程序从文本文件中读取(保存)数据_c++从文件中读取数据_STATICHIT静砸的博客-CSDN博客 在C程序中:与程序代码外的数据(文件)打交道,我们使用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换。——文件流:C标准库提供了FILE(之所以命名为FILE,因为linux将所有机制都视为文件) ,FILE对象是一个包含了管理流所需的所有信息的结构,包括缓冲区信息、各种标记(如文件结束标记和错误标记)以及用于实际I/O的文 件描述符等。——输入流,输入流:数据从文件传送到内存的叫输入流,数据从内存传送到文件的叫输出流。——打开文件:FILE对象通过调用fopen函数.._c++从文件中读取数据 https://blog.csdn.net/m0_62742402/article/details/123158011

你的代码是GPT生成的吧?你先把那些语法错误修改好了,比如第四行的ifs,以及后面for循环的GetLine。然后因为读取出来的都是字符串,数据类型判断起来比较复杂,你可以先预定义好每一列数据格式,然后读到那一列就直接转


//数据结构
struct Mechanics
{
int Quantum;
int Atoms;
float Boxsize[3][2]; //三行,每行2数据
float Atomcoordinates[9][3]; //九行,每行3数据
} strDate[3]; //三组
//数据访问
int i,j,k,m,n;
strDate[k].Boxsize[i][j]
strDate[k].Atomcoordinates[m][n]

读文件时一般都是安装字符串读取,碰到分界符号后,确定列数,把序号、数量列数据等数据转为整数,毛重等列数据转为浮点数,其他保持字符串,对应存储即可。

提供一下你的csv文件。这样我们可以方便测试。因为这个需要对齐数据,和你的原始数据有很大关系。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7657860
  • 除此之外, 这篇博客: 【数据结构与算法】- 排序(算法)中的 十:有一种简单的排序算法,称为计数排序,这种排序算法对一个待排序的表(用数组表示)进行排序,并将排序结果存放到另一个新的表中,必须注意的是,表中所有待排序的关键码互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某个记录统计出的计数值为c,则这个记录在新有序表中的合适存放位置为c 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    #include<iostream>
    using namespace std;
    
    void countsort(int a[],int b[],int n)
    {
    	//遍历每一趟
    	int count=0;
    	for(int i=0;i<n;i++)
    	{
    		//找到每个元素小的个数
    		count = 0;
    		for(int j=0;j<n;j++)
    		{
    			if(a[j]<a[i]) count++;
    		}
    		b[count] = a[i];
    	}
    }
    int main()
    {
    	int a[6]={3,5,7,2,4,9},b[6];
    	countsort(a,b,6);
    	for(int i=0;i<6;i++) cout<<b[i]<<" ";
    	return 0;
    }


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^