首先对于CSV,我们需要明确几个概念,第一个就是CSV的每行中的每列之间的间隔是以“,”实现的!举个例子!
比如如上的表格,实质上是 chensi,123456,10000,QB001/33,AS124/39 ,C++从csv文件里读取一行读取出来的就是这样的格式。
第二个需要清楚的就是,我们对于一个文件,可以通过鼠标点击点击的方式选取我想要修改的部分,而C++读取的是不存在(或者至少我不清楚)跨内容读取的即读取指定行,编译器一开始总是从头开始读取的!那对于这个问题,我们可以采取从头读取每行读取然后存入动态数组vector的方式!
#include<bits/stdc++.h>
using namespace std;
int main()
{
string value;
char filename[256];
string line;
cout<<"请输入文件名"<<endl;
cin>>filename;
cout<<endl;
cout<<endl;
ifstream infile(filename);
string temp;
int flag=0;
int flag1=0;
vector<string>neirong;//创建动态string数组来储存文件里的每行的内容
while(infile.good())
{
getline(infile, line);//按行读取CSV文件
flag++;//记录行数
neirong.push_back(line);
}
infile.close();
for(int i=0;i<neirong.size();i++)
{
cout<<neirong[i]<<endl;
}
ofstream onfile(filename);
for(int l=0;l<neirong.size();l++)
{
onfile<<neirong[l]<<endl;
}
onfile.close();
return 0;
}
我们要读取的文件为yonghu.csv
下面是运行结果
现在我们可以每行读取出来,但对于列的读取还没有实现,对于这个问题我们可以采取以逗号为标记来对每行的string进行分隔!
#include<bits/stdc++.h>
using namespace std;
void xiugai(string &a,int lie1)
{
cout<<"开始进行修改操作!"<<endl;
string temp;
string zuizhong;//最终得出的一个字符串,来覆盖原有的字符串的字符串!
int cont=0;
int flag=0;
int neirongshu=0;//一共有多少内容,来判断有几个逗号!
vector<string>aa;
string xinneirong;
char b[100];
char c[100];
strcpy(b,a.c_str());
char delims[] = ",";
char *result = NULL;
char *shizhi = NULL;
shizhi = strtok( b, delims );
while( shizhi != NULL )
{
neirongshu++;
shizhi = strtok( NULL, delims );
}
strcpy(c,a.c_str());
result = strtok( c, delims );
cout<<"请输入新数据!"<<endl;
cin>>xinneirong;
while( result != NULL )
{
cont++;
temp=result;
if(cont<neirongshu)
{
temp+=',';
}
aa.push_back(temp);//将每列的内容加上逗号压入vector
result = strtok( NULL, delims );
}
aa[lie1-1]=xinneirong+',';//因为数组是从0开始的
for(int ii=0;ii<aa.size();ii++)
{
zuizhong+=aa[ii];
}
a=zuizhong;//使传进来的string变成修改后的string
return;
}
int main()
{
string line;
char filename[256];
cout<<"请输入你要进行修改的文件!"<<endl;
cin>>filename;
int hang;//需要进行修改的行数
int lie;//需要进行修改的列数
ifstream infile(filename);
string temp;
int flag=0;
vector<string>neirong;//创建动态string数组来储存文件里的数据
while(infile.good())//文件是否正确打开
{
getline(infile, line);
flag++;//记录行数
neirong.push_back(line);
}
infile.close();
cout<<"请输入你要修改的行数和列数,以回车作为分隔!"<<endl;
cin>>hang>>lie;
while(1)
{
if(hang<=flag&&hang>0)
{
break;
}
if(hang>flag)
{
cout<<"请输入正确的行数!"<<endl;
cin>>hang;
}
}
int douhao=0;//记录逗号数
for(int i=0;i<=neirong[hang-1].size();i++)
{
if(neirong[hang-1][i]==',')
{
douhao++;
}
}
cout<<"逗号数为"<<douhao<<endl;
while(1)
{
if(lie<=douhao+1&&lie>0)
{
break;
}
if(lie>douhao+1)
{
cout<<"请输入正确的列数!"<<endl;
cin>>lie;
}
}
xiugai(neirong[hang-1],lie);//向xiugai函数传入string(即需要修改的行的内容)和需要修改的列数
ofstream onfile(filename);
cout<<"现在进行写入csv文件操作!"<<endl;
for(int l=0;l<neirong.size();l++)
{
onfile<<neirong[l]<<endl;
}
cout<<"写入完毕!"<<endl;
onfile.close();
cout<<"关闭写入流!"<<endl;
return 0;
}
修改前的文件
程序运行情况
修改完毕后的文件