在处理测绘或其他专业的数据时,有时你会遇到有着同类信息成百上千个文件,当我们需要提取、修改或者插入全部文件某些信息时,一个个打开文件,粘贴复制、修改插入显然是不可取的。这时我们就需要编个程序,批量的操作这些文件。
1.批量读文件
使用sprintf_s()函数,定义文件名,再用一个for循环读取文件;
*.txt文件放在工作目录:\data文件夹下,每个data.txt内有一行字符串。
sprint_f()用法:
//函数功能:将数据格式化输出到字符串
//函数原型:
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format [,
argument] ...
/*头文件:stdio.h
注意:sprintf_s()是sprintf()的安全版本,通过指定缓冲区长度来避免sprintf()存在的溢出风险
//例子1
char filename[30];//需要预先分配缓冲区
char path[8] = "data\\";
char name[8] = "data_i";
sprintf_s(filename,"%s %s",path,name);
char filename[40];
sprintf_s(filename,"%s %d %c","test",1,'2');
/*第一个参数就是指向要写入的那个字符串的指针*/
以上内容参考:https://blog.csdn.net/tigernana/article/details/6916491
https://blog.csdn.net/u012406177/article/details/70243062
以下是源代码:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
//若读取的是int数据,则改为注释的部分
string str, tem;
//int dat[6];
for (int i = 1; i < 7; i++)
char data_name[20];
//数据在data文件夹下(“data\\”表示在当前工作目录的data文件夹下)
sprintf_s(data_name, "%s%d%s", "data\\data_", i, ".txt");
ifstream file_name(data_name);
if (!file_name.is_open())
cout << "open file error!" << endl;
return 0;
file_name >> tem;
//file_name >> a[i-1];
str = str + tem+"\n";
file_name.close();
cout << str;
//cout << a[0];
return 0;
控制台结果如下:
2.将读取的数据写入out.txt
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
string str,tem;
ofstream out("out.txt",ios::trunc);
for (int i = 1; i < 7; i++)
char data_name[20];
sprintf_s( data_name, "%s%d%s", "data\\data_", i,".txt");
ifstream file_name(data_name);
if (!file_name.is_open())
cout << "error" << endl;
return 0;
//数据读入
file_name >> tem;
//数据写出
out << "data_" << i << ":" <<tem<< endl;
str = str + tem;
file_name.close();
out.close();
return 0;
结果会在工作目录下生成一个out.txt,内容如下:
3.批量向文件中插入一行内容
向第i个文件第3行与第4行之间插入一行内容“volleyball_data_i”:
首先数据有data_1.txt~data_2.txt;
每个txt文件的内容如下:
(注意:data_1.txt,文件里有10行数据,若最后一行加了一个回车则为11行!使用file.eof()+getline()组合时要注意!以免出错)
代码如下:
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
string str,tem ;
for (int i = 1; i < 7; i++)
char data_name[20];
//连接文件名sprintf_s()
sprintf_s( data_name, "%s%d%s", "data\\data_", i,".txt");
//打开第i个文件,并读入数据
ifstream file_in(data_name);
if (!file_in.is_open())
cout << "error" << endl;
return 0;
//使用getline()按行读取第i个文件内容,储存在A中
string A[10] = { "" };
int line = 0;
while (!file_in.eof())
string B = "";
getline(file_in, B);
A[line] = B + "\n";
//cout << A[i];
line++;
file_in.close();
//打开文件写入数据,并在3,4行间插入一个字符串
ofstream file_out(data_name, ios::trunc);
for (int k = 0; k < 10; k++)
file_out << A[k];
if (k == 2)
file_out << "volleyball_data_"<< i << endl;
file_out.close();
return 0;
最终更新的data文件如下以data_1.txt为例:
4.批量修改文件中的某一行内容
将第4行内容修改为:“4 volleyball_data_i”:
只要将第3节中的下面一个for循环改成以下形式即可:
//替换第四行的内容
for (int k = 0; k < 10; k++)
if (k == 3)
file_out << "4 volleyball_data_" << i << endl;
file_out << A[k];
结果如下,data_1.txt为例:
在最近的一个项目中,需要用c++读取6000多个文件。大家都知道,c++读取文件的能力没有Java等语言那么强大,但是在经过了一系列的尝试之后,成功了。在实施过程中将其分为两步,便于理解。(1)获取需要读取的文件的所有文件名,并保存到filepath.txt中 ;(2)每次从filepath.txt中读取一行作为路径,最后用一个“for循环”,或者feof()函数控制结束。一、以下共享获取文件名的...
正常的打开文件读写数据,用fopen,然后fprintf就可以了,不过,我这里有个小需求,就是要对文件进行有规律的命名,例如a_1.txt、a_2.txt、a_3.txt…最近有个需求,就是要把一个C++工程代码某个部分的数据变量数据采样出来一些,涉及到把大批量数据多次读到多个文件中。这里不得不吐槽下C++,这么多年过去了,写数据还是只能一个一个往文件中写,哈哈哈,底层的基本操作永远都不过时。
std::unique_ptr<char> get_file_content(const std::string& filename)
std::ifstream filestr(filename, std::ios::binary);
auto size = filestr.rdbuf() -> pubseekoff(0, std::io
在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传
1 在头文件创建txtAccessor类,在源文件采用简单的菜单形式调用
2 txtAccessor有四个功能,txt文件的存、取、编辑、打印
3 存取需要输入文件名
4 编辑是对之前内容的续写,编辑以换行+end结束
5 隐藏功能,通过连续两次读文件可以实现文件合并
#include<iostream>
#include...