首先对于CSV,我们需要明确几个概念,第一个就是CSV的每行中的每列之间的间隔是以“,”实现的!举个例子!

C++修改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

C++修改csv文件指定行指定列的数据

下面是运行结果

C++修改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;  
}  

 

修改前的文件
C++修改csv文件指定行指定列的数据

程序运行情况

C++修改csv文件指定行指定列的数据

修改完毕后的文件

C++修改csv文件指定行指定列的数据

 

相关文章: