C++ 批量读写txt文件

前言:

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

 

目录

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为例:

                                            

猜你喜欢

转载自blog.csdn.net/qq_29406323/article/details/81282165