前言:
在处理测绘或其他专业的数据时,有时你会遇到有着同类信息成百上千个文件,当我们需要提取、修改或者插入全部文件某些信息时,一个个打开文件,粘贴复制、修改插入显然是不可取的。这时我们就需要编个程序,批量的操作这些文件。
目录
1.批量读文件
2.将读取的数据写入out.txt
3.批量向文件中插入一行内容
4.批量修改文件中的某一行内容
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);
//例2
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;
}
else
{
file_out << A[k];
}
}
结果如下,data_1.txt为例: