C++ 如何读取多个文件后存储到一个文件中
现在有编号为:1,2,3,……,n的txt文件,每个文件的内容均为以下形式:Timelevelleveln0010.01039.436.040022.01097.756....
现在有编号为:1,2,3,……,n的txt文件,每个文件的内容均为以下形式:
Time level level n
001 0.0 1039.4 36.0 4
002 2.0 1097.7 56.1 4
003 4.0 1098.9 24.8 4
004 6.0 1107.7 -2.6 4
005 8.0 1098.4 30.6 4
006 10.0 1093.1 -56.7 4
007 12.0 1107.9 -83.6 4
008 14.0 1090.3 -109.9 4
009 16.0 1108.1 -132.0 4
010 18.0 1099.4 -156.4 4
011 0.0 1039.4 36.0 5
012 2.0 1129.2 61.0 5
013 0.0 1039.4 36.0 6
014 2.0 861.6 23.0 6
015 4.0 783.4 -15.3 6
怎么读取这n个文件,然后将他们存储到一个名为“abc”的txt中?
我只知道单独读取的代码,也可以将我这个读取单独txt文件的代码改改后用,要是有更好的方法还请帮我指出来怎么操作。谢谢。
#include <iostream>
using namespace std;
struct BaseData
{
int row,con;
float tim;
float *line;
};
int main()
{
int i,c=2,m=50;
BaseData *base=new BaseData[m];
for(i=0;i<m;i++)
{
base[i].line=new float[c];
}
i=0;
FILE *fp;
char s[18];
if((fp = fopen("TestData.txt","rt")) == NULL)
{
printf("不能打开文件\n");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%f%f%f%d",s,
&base[i].tim,&base[i].line[0],&base[i].line[1],&base[i].con);
printf("%3d: %5.1f,%8.1f,%8.1f,%4d\n",i+1,
base[i].tim,base[i].line[0],base[i].line[1],base[i].con);
base[i].row=++i;
}
fclose(fp);
} 展开
Time level level n
001 0.0 1039.4 36.0 4
002 2.0 1097.7 56.1 4
003 4.0 1098.9 24.8 4
004 6.0 1107.7 -2.6 4
005 8.0 1098.4 30.6 4
006 10.0 1093.1 -56.7 4
007 12.0 1107.9 -83.6 4
008 14.0 1090.3 -109.9 4
009 16.0 1108.1 -132.0 4
010 18.0 1099.4 -156.4 4
011 0.0 1039.4 36.0 5
012 2.0 1129.2 61.0 5
013 0.0 1039.4 36.0 6
014 2.0 861.6 23.0 6
015 4.0 783.4 -15.3 6
怎么读取这n个文件,然后将他们存储到一个名为“abc”的txt中?
我只知道单独读取的代码,也可以将我这个读取单独txt文件的代码改改后用,要是有更好的方法还请帮我指出来怎么操作。谢谢。
#include <iostream>
using namespace std;
struct BaseData
{
int row,con;
float tim;
float *line;
};
int main()
{
int i,c=2,m=50;
BaseData *base=new BaseData[m];
for(i=0;i<m;i++)
{
base[i].line=new float[c];
}
i=0;
FILE *fp;
char s[18];
if((fp = fopen("TestData.txt","rt")) == NULL)
{
printf("不能打开文件\n");
exit(0);
}
while(!feof(fp))
{
fscanf(fp,"%s%f%f%f%d",s,
&base[i].tim,&base[i].line[0],&base[i].line[1],&base[i].con);
printf("%3d: %5.1f,%8.1f,%8.1f,%4d\n",i+1,
base[i].tim,base[i].line[0],base[i].line[1],base[i].con);
base[i].row=++i;
}
fclose(fp);
} 展开
展开全部
#include <iostream>
#include <fstream>
#include <list>
#include <string>
using namespace std;
//用于读取各类文件的函数模板
template <class basic_l>
int loadfile(list<basic_l> &basic_any,string &filename)
{
ifstream infile(filename);
int num=0;
if (!infile){
cout <<"没有找到此数据文件!"<<endl;
}
else {
basic_l temp;
while (infile >> temp){
basic_any.push_back(temp);
num++;
}
infile.close();
infile.clear();
}
return num;
}
//用于写入各类文件的函数模板
template <class basic_s>
void savefile(list<basic_s> &basic_any, string &filename)
{
ofstream outfile(filename);
list<basic_s>::iterator li_f = basic_any.begin();
list<basic_s>::iterator li_e = basic_any.end();
for(;li_f!=li_e;li_f++){
outfile<<*li_f;
}
outfile.close();
outfile.clear();
}
class BaseData
{
friend istream& operator >> (istream &in, BaseData &m_class)
{
in >> m_class.line
>> m_class.tim
>> m_class.live1
>> m_class.live2
>> m_class.row;
return in;
}
friend ostream & operator << (ostream& out, BaseData& m_class)
{
out << m_class.line <<"\t"
<<m_class.tim <<"\t"
<<m_class.live1 <<"\t"
<<m_class.live2 <<"\t"
<<m_class.row;
return out;
}
public:
int line;
float tim;
float live1;
float live2;
int row;
};
int main()
{
list <BaseData> a;
string b;
cout<<"请输入所有文件名,空格或回车间隔,按Ctrl+Z结束"<<endl;
while(cin>>b){
loadfile(a,b);
}
cout <<"请输入要保存的文件名"<<endl;
cin>>b;
savefile(a,b);
}
更多追问追答
追问
您好,我用您的代码试了一下,总是显示”没有找到此数据文件!“,请问是怎么回事?
追答
因为没有文件存在,你一定要先用savefile保存一个数据文件才能用loadfile
展开全部
文件名有规律,可用程序生成输入文件名。
例如:for (i=1;i<=n;i++) sprintf(namein,"aa%d.txt",i);
生成输入文件名 aa1.txt, aa2.txt, aa3.txt ...
不要求选择数据,那么可以用循环语句按行读入,按行写出。
程序如下:
#include <iostream>
#include <cstring>
using namespace std;
#include <stdio.h>
main(){
FILE *fin, *fout;
char namein[80];
char line[80];
int i,j;
int n=4;fout = fopen("abc.txt","w"); // 输出文件
for (i=1;i<=n;i++){
sprintf(namein,"aa%d.txt",i); //输入文件名
fin = fopen(namein,"r"); // 打开1个文件
if (fin !=NULL){
while(1){
if (fgets(&line[0],80,fin)==NULL) break; // 读1行
fprintf(fout,"%s",line); //写1行
};
fclose(fin);
};
}
fclose(fout);
return 0;
}
======
更简单的是用system(), 调 DOS copy 命令来做。
例如:for (i=1;i<=n;i++) sprintf(namein,"aa%d.txt",i);
生成输入文件名 aa1.txt, aa2.txt, aa3.txt ...
不要求选择数据,那么可以用循环语句按行读入,按行写出。
程序如下:
#include <iostream>
#include <cstring>
using namespace std;
#include <stdio.h>
main(){
FILE *fin, *fout;
char namein[80];
char line[80];
int i,j;
int n=4;fout = fopen("abc.txt","w"); // 输出文件
for (i=1;i<=n;i++){
sprintf(namein,"aa%d.txt",i); //输入文件名
fin = fopen(namein,"r"); // 打开1个文件
if (fin !=NULL){
while(1){
if (fgets(&line[0],80,fin)==NULL) break; // 读1行
fprintf(fout,"%s",line); //写1行
};
fclose(fin);
};
}
fclose(fout);
return 0;
}
======
更简单的是用system(), 调 DOS copy 命令来做。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-11-30 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
这里假设string类型可能包含任意字符。否则,只需用不可能出现的字符分隔开即可。
因此,唯一的办法是将string的长度也写入到文件当中。下面是示例:
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>
inline void WriteString(std::ostream& ostr, std::string const& str) {
// 写入字符串长度
ostr << str.size() << "\n";
// 写入字符串
ostr.write(str.data(), str.size());
}
inline std::string ReadString(std::istream& istr) {
// 获取字符串长度
std::string line;
std::getline(istr, line);
std::istringstream tmp(line);
std::size_t size;
tmp >> size;
// 读取字符串
std::vector<char> result(size);
istr.read(result.data(), size);
return std::string(result.begin(), result.end());
}
int main() {
std::string const filename = "t.txt", s1 = "string 1 \n Yeah!", s2 = "string 2 \\ Yep!";
{
std::ofstream ostr(filename);
WriteString(ostr, s1);
WriteString(ostr, s2);
}
{
std::ifstream istr(filename);
std::cout << (ReadString(istr) == s1 && ReadString(istr) == s2) << "\n";
}
return 0;
}
因此,唯一的办法是将string的长度也写入到文件当中。下面是示例:
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>
inline void WriteString(std::ostream& ostr, std::string const& str) {
// 写入字符串长度
ostr << str.size() << "\n";
// 写入字符串
ostr.write(str.data(), str.size());
}
inline std::string ReadString(std::istream& istr) {
// 获取字符串长度
std::string line;
std::getline(istr, line);
std::istringstream tmp(line);
std::size_t size;
tmp >> size;
// 读取字符串
std::vector<char> result(size);
istr.read(result.data(), size);
return std::string(result.begin(), result.end());
}
int main() {
std::string const filename = "t.txt", s1 = "string 1 \n Yeah!", s2 = "string 2 \\ Yep!";
{
std::ofstream ostr(filename);
WriteString(ostr, s1);
WriteString(ostr, s2);
}
{
std::ifstream istr(filename);
std::cout << (ReadString(istr) == s1 && ReadString(istr) == s2) << "\n";
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询