现在如果把csv文件换成输出成txt文件,怎样修改代码才能顺利读取文件

这张图片的内容是csv文件

img

读取并存储各个元素以用以计算的代码如下

include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<fstream>
#include<sstream>
#include <complex>
#include <string.h>


using namespace std;
 
typedef struct record
{
    int serial_number;
    char code_name[128];
    char name[128];
    int number;
    char material[128];
    float single_weight;
    float total_weight;
    char material_code[128];
    char remark[128];
}record;
 
#define MAX_LINE 1024
static record records_[MAX_LINE];
 
int main()
{
    int ret,i,count;
    FILE* f = fopen("D://zhao//0725//32处理前.csv", "rb");        
    if(!f)
        cout<<"fail to read file"<<'\n';
    //cin.get();


    for (i = 0; i < MAX_LINE; i++)
    {
        ret = fscanf(f, "%d,%[^,],%[^,],%d,%[^,],%f,%f,%[^,],%[^\r]", &records_[i].serial_number, 
            records_[i].code_name, records_[i].name, &records_[i].number, records_[i].material,
            &records_[i].single_weight, &records_[i].total_weight, records_[i].material_code, records_[i].remark);//按行读取
        if(records_[i].serial_number == 0)
            break;    
    }
    fclose(f);
    count = i;
    printf("csv line count %d\n", count);    
    for (i = 0; i < count; i++)
    {
        cout<<"i="<<i<<'\t'<<records_[i].serial_number<<'\t'<<records_[i].remark<<'\n';
    } 





    ofstream of("D://zhao//0725//处理后//11.txt");
    //of.setf(ios::fixed);
    if(!of)
    {
        cout<<"不能打开目的文件\n";
        cin.get();
    }
    
    of<<"序号"<<'\t'<<"物料码"<<'\t'<<"名称"<<'\t'<<"代号"<<'\t'<<"材料"<<'\t'<<"数量"<<'\t'<<"         "<<'\t'<<"备注"<<'\n';
    for(i>0;i--;)//nnp:particle name//
    {


        of<<records_[i].serial_number<<'\t'<<records_[i].material_code<<'\t'<<records_[i].name<<'\t'<<records_[i].code_name<<'\t'<<records_[i].material<<'\t'<<records_[i].number<<'\t'<<"         "<<'\t'<<records_[i].remark<<'\n';
        
    }

    cout<<"Complete the calcula"<<'\n';
    cin.get();
    return 0;
}


现在如果把csv文件换成输出成txt文件,内容还是一样,怎样修改代码才能顺利读取文件。

csv文件如下:

img

txt文件如下:

img

@churuxu

相关csv和txt文件可以从如下链接下载,劳烦各位帮忙测试一下。提取码1234。
https://pan.baidu.com/s/1_cCnJCKsum5axE089D4ECA

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<fstream>
#include<sstream>
#include <complex>
#include <string.h>
 
 
using namespace std;
 
typedef struct record
{
    int serial_number;
    char code_name[128];
    char name[128];
    int number;
    char material[128];
    float single_weight;
    float total_weight;
    char material_code[128];
    char remark[128];
}record;
 
#define MAX_LINE 1024
static record records_[MAX_LINE];
 
int main()
{
    int ret,i,count;
    FILE* f = fopen("a.csv", "rb");        
    if(!f)
        cout<<"fail to read file"<<'\n';
    //cin.get(); 
 
    for (i = 0; i < MAX_LINE; i++)
    {
        ret = fscanf(f, "%d,%[^,],%[^,],%d,%[^,],%f,%f,%[^,],%[^\r]", &records_[i].serial_number, 
            records_[i].code_name, records_[i].name, &records_[i].number, records_[i].material,
            &records_[i].single_weight, &records_[i].total_weight, records_[i].material_code, records_[i].remark);//按行读取    
        if(records_[i].serial_number == 0)
            break;    
    }
    fclose(f);
    count = i;
    printf("csv line count %d\n", count);    
    for (i = 0; i < count; i++)
    {
        cout<<"i="<<i<<'\t'<<records_[i].serial_number<<'\t'<<records_[i].remark<<'\n';
    } 
  
    ofstream of("a.txt");
    //of.setf(ios::fixed);
    if(!of)
    {
        cout<<"不能打开目的文件\n";
        cin.get();
    }
    
    of<<"序号"<<'\t'<<"物料码"<<'\t'<<"名称"<<'\t'<<"代号"<<'\t'<<"材料"<<'\t'<<"数量"<<'\t'<<"         "<<'\t'<<"备注"<<'\n';
    for(i>0;i--;)//nnp:particle name//
    {
 
 
        of<<records_[i].serial_number<<'\t'<<records_[i].material_code<<'\t'<<records_[i].name<<'\t'<<records_[i].code_name<<'\t'<<records_[i].material<<'\t'<<records_[i].number<<'\t'<<"         "<<'\t'<<records_[i].remark<<'\n';
        
    }
    
    cout<<"Complete the calcula"<<'\n';
    of.close();



    f = fopen("a.txt", "rb");        
    if(!f)
        cout<<"fail to read file"<<'\n';
    //cin.get(); 
 
    char line[1024];
    fgets(line, 1024, f);

    for (i = 0; i < MAX_LINE; i++)
    {
        if(!fgets(line, 1024, f))break;
        ret = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%[^\t]\t%d%s", &records_[i].serial_number, 
            records_[i].material_code, records_[i].name, records_[i].code_name, records_[i].material,
            &records_[i].number, records_[i].remark);
        if(ret == 6)records_[i].remark[0] = 0;
        else if(ret != 7)break;
    }
    fclose(f);
    count = i;
    printf("txt line count %d\n", count);    
    for (i = 0; i < count; i++)
    {
        cout<<records_[i].serial_number<<'\t'<<records_[i].material_code<<'\t'<<records_[i].name<<'\t'<<records_[i].code_name<<'\t'<<records_[i].material<<'\t'<<records_[i].number<<'\t'<<"         "<<'\t'<<records_[i].remark<<'\n';       
    } 


    cin.get();
    return 0;
}
 
 

要看你的 32处理前.csv 的内容
你用记事本打开,看下原始内容是什么

看您*.csv和*.txt 文本,仅是分隔符不一样。csv是用半角逗号分隔,全球通用格式。您的txt改成了您“私有”的Tab制表符(也就是有些说的*.tsv文本了),您只需要在读取txt时说明分隔符就好了。

  • 我只会点儿python ,python 就是读取标准csv(逗号分隔)时是缺省参数,可以不用给出,自定义分隔符,在参数中指定分隔字符。您的格式就是:
    读取函数('\t')

  • 我的“私有”csv,用反斜杠分隔。


讲fscanf里面逗号换为\t,之前是逗号分割,现在text是制表符分割

不就是分割符号不同吗

按行读取txt文件内容之后,对每一行的内容采用逗号分割成数组进行解析。

读取csv样例

#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <string>
using namespace std;

int main()
{

    int len_x=5921;
    double x[len_x];
    ifstream inFile("gene_new.CSV", ios::in);
    if (!inFile)
    {
        cout << "打开文件失败!" << endl;
        exit(1);
    }
    int i = 0;
    string line;
    string field;
    while (getline(inFile, line))//getline(inFile, line)表示按行读取CSV文件中的数据
    {
        string field;
        istringstream sin(line); //将整行字符串line读入到字符串流sin中

        getline(sin, field, ','); //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
//        cout<<atof(field.c_str())<<" ";//将刚刚读取的字符串转换成int
        x[i]=atof(field.c_str());
        i++;
    }
    inFile.close();
//    看看建立的数组好了没
    for(i=0;i<len_x;i++)
    {
        cout<<"NO."<<i+1<<":"<<x[i]<<endl;
    }
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std;

typedef struct record
{
    int serial_number;
    char material_code[128];
    char name[128];
    char code_name[128];
    char material[128];
    int number;
    float single_weight;
    float total_weight;
    char remark[128];
} record;

#define MAX_LINE 1024
static record records_[MAX_LINE];

int main()
{
    int ret, i, count;
    FILE* f = fopen("D://zhao//0725//处理后//11.txt", "r");
    if (!f)
    {
        cout << "fail to read file" << '\n';
        return -1;
    }

    for (i = 0; i < MAX_LINE; i++)
    {
        ret = fscanf(f, "%d\t%s\t%s\t%s\t%s\t%d\t\t\t%s", &records_[i].serial_number,
            records_[i].material_code, records_[i].name, records_[i].code_name, records_[i].material,
            &records_[i].number, records_[i].remark); //按行读取
        if (ret != 7)
            break;
    }
    fclose(f);
    count = i;

    cout << "txt line count " << count << '\n';
    for (i = 0; i < count; i++)
    {
        cout << "i=" << i << '\t' << records_[i].serial_number << '\t' << records_[i].remark << '\n';
    }

    ofstream of("D://zhao//0725//处理后//output.txt");
    if (!of)
    {
        cout << "不能打开目的文件\n";
        return -1;
    }

    of << "序号" << '\t' << "物料码" << '\t' << "名称" << '\t' << "代号" << '\t' << "材料" << '\t' << "数量" << '\t' << '\t' << "备注" << '\n';
    for (i = count - 1; i >= 0; i--)
    {
        of << records_[i].serial_number << '\t' << records_[i].material_code << '\t' << records_[i].name << '\t'
            << records_[i].code_name << '\t' << records_[i].material << '\t' << records_[i].number << '\t' << '\t'
            << records_[i].remark << '\n';
    }

    cout << "Complete the calculation" << '\n';
    return 0;
}

把,换成\t\n不可以吗

指定一个分隔符

不知道你这个问题是否已经解决, 如果还没有解决的话:

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

C++中,将CSV文件转换为TXT文件只是改变了文件扩展名,即将CSV文件的内容复制到TXT文件中。CSV文件是以逗号分隔的文本文件,而TXT文件可以是任何格式的文本文件。所以,将CSV文件转换为TXT文件只是更改文件扩展名,并且在保存TXT文件时,可以自由选择保存的内容格式。

以下是一个简单的示例代码,演示如何将CSV文件内容复制到TXT文件中:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream inputFile("input.csv"); // 打开CSV文件
    std::ofstream outputFile("output.txt"); // 创建一个名为output.txt的输出文件流

    if (!inputFile.is_open() || !outputFile.is_open()) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 逐行读取CSV文件内容,并写入TXT文件
    std::string line;
    while (std::getline(inputFile, line)) {
        outputFile << line << std::endl;
    }

    // 关闭文件
    inputFile.close();
    outputFile.close();

    std::cout << "CSV文件已成功转换为TXT文件" << std::endl;

    return 0;
}


上述代码将名为"input.csv"的CSV文件的内容复制到名为"output.txt"的TXT文件中。请确保替换文件名和路径为您实际使用的文件名和路径。

请注意,上述代码只是将CSV文件内容原样复制到TXT文件中。如果您想对CSV文件进行解析,并以其他格式输出到TXT文件,您可以使用适当的方法来处理CSV数据,并将转换后的数据写入TXT文件。例如,您可以使用C++的字符串处理和分割函数来解析CSV文件的行和字段,并根据需要重新格式化数据。