添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在处理测绘或其他专业的数据时,有时你会遇到有着同类信息成百上千个文件,当我们需要提取、修改或者插入全部文件某些信息时,一个个打开文件,粘贴复制、修改插入显然是不可取的。这时我们就需要编个程序,批量的操作这些文件。

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);
    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...