遇到一个十分棘手的c++数据处理问题具体问题,数据文件是这种类型
想把每一列的元素存储到对应类型的数组,然后进行计算重新排序处理,现在无法成功读取每一列对应的元素,导致无法计算,求帮忙读取每一列的元素并将其存储到对应类型的数组中。
```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;
}
你的代码是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文件。这样我们可以方便测试。因为这个需要对齐数据,和你的原始数据有很大关系。
不知道你这个问题是否已经解决, 如果还没有解决的话:#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;
}