这张图片的内容是csv文件
读取并存储各个元素以用以计算的代码如下
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文件如下:
txt文件如下:
相关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文件的行和字段,并根据需要重新格式化数据。