C/C++:读写txt/二进制文件

fopen() 函数用来打开一个文件,它的原型为:

FILE *fopen(char *filename, char *mode);

filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个FILE类型的结构体变量中,然后将该变量的地址返回。

FILE是在stdio.h头文件中定义的一个结构体,用来保存文件信息。

如果希望接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:

FILE *fp = fopen("demo.txt", "r");

表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针。

写入内容到txt文件

FILE* fp = fopen("model_vertices_recalc.txt", "a+");//r(read),w(write),a(append)
fprintf(fp, "This is testing for fprintf...\n");//第二个形参类型:const char* _Format
fprintf(fp, "This is testing for %d fprintf...\n",5);//第二个形参支持两种方式
fputs("This is testing for fputs...\n", fp);//这种方式不支持写入变量
fputc('M', fp);//这个是写入字符
fclose(fp);
return 0;

从txt文件读取内容

FILE* fp = NULL;
char buff[255];

fp = fopen("model_vertices_recalc.txt", "r");

fgets(buff, 255, (FILE*)fp);//读取一行字符串
printf("0: %s\n", buff);

fscanf(fp, "%s", buff);//遇到空格停止
printf("1: %s\n", buff);
int i = 0;
sscanf(buff, "%d", &i);//将buff中的数据写入到int类型中
cout << i << endl;

fgets(buff, 255, (FILE*)fp);//读取整行,从上面那个空格出读取剩余的整行
printf("2: %s\n", buff);

fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff);
fclose(fp);

写入数据到二进制文件

    FILE* fp = NULL;
    fp = fopen("test.bin", "wb+");
    for (int i = 0; i < 10; i++)
    {
        fwrite((void*)&i, sizeof(int), 1, fp);//将10个int数据一次写入文件
    }

    fclose(fp);

从二进制文件中读取数据

    FILE* fp = NULL;
    fp = fopen("test.bin", "rb");
    int a[10];
    
    for (int i = 0; i < 10; i++)
    {
        fread((void*)&a[i], sizeof(int), 1, fp);//读取上面写入的int给到数组a
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << a[i] << endl;
    }

    fseek(fp, sizeof(int)*3, SEEK_SET);//对文件指针重新定位,读取第四个数
    int b;
    fread((void*)&b, sizeof(int), 1, fp);
    cout << b << endl;
    fclose(fp);

 

c++将txt中的数据保存为二进制文件

    //==============================
    //将txt中的数据保存为二进制文件,txt文件中每行有四个数值,将其保存为float数据
    //存入bin文件内

    String vertices_file = "D:\\model_vertices_recalc.txt";
    std::ifstream fv(vertices_file, std::ios::in);
    std::ofstream outFile("TwoPairCoordinate.bin", std::ios::out | std::ios::binary);
    if (!outFile)
    {
        std::cerr << "failed to open the file." << std::endl;
        return -1;
    }
    float cor;
    std::vector<float> vertices;
    while (!fv.eof())
    {
        fv >> cor;
        outFile.write(reinterpret_cast<const char*>(&cor), sizeof(float));
    }
    fv.close();
    outFile.close();

C++将txt中的两列数据分别读取出来,存到两个向量中

int main()
{
	ifstream ifs;							//创建流对象
	ifs.open("***.txt", ios::in);	//打开文件
	if (!ifs.is_open())						//判断文件是否打开
	{
		cout << "打开文件失败!!!";
		return 0;
	}
	vector<float> target_1, target_2;	//用于存放目标数据
	vector<string> item;				//用于存放文件中的一行数据
	string temp;						//把文件中的一行数据作为字符串放入容器中

	while (getline(ifs, temp))          //利用getline()读取每一行,并放入到 item 中
	{
		item.push_back(temp);
	}
	ifs.close();	//关闭文件,此时已经把数据全部读出来放在item里了,后面只需操作item即可

	for (auto it = item.begin(); it != item.end(); it++)
	{
		cout << *it << endl;
		istringstream istr(*it);                 //其作用是把字符串分解为单词(在此处就是把一行数据分为单个数据)
		string str;
		int count = 1;							 //统计一行数据中单个数据个数
		//获取文件中的第 1、2 列数据
		while (istr >> str)                      //以空格为界,把istringstream中数据取出放入到依次s中
		{
			if (count == 1) //获取第1列数据
			{
				float r = atoi(str.c_str());       //数据类型转换,将string类型转换成float,如果字符串不是有数字组成,则字符被转化为 0
				target_1.push_back(r);
			}
			else if (count == 2)//获取第2列数据
			{
				float r = atoi(str.c_str());       //数据类型转换,将string类型转换成float
				target_2.push_back(r);
			}
			count++;
		}
	}

	cout << "数据个数(灰度256以内):" << target_1.size() << endl;

	auto it = target_1.begin();
	auto itt = target_2.begin();

	for (; it != target_1.end(), itt != target_2.end(); it++, itt++)
	{
		cout << *it << "      \t" << *itt << endl;
	}

	system("pause");
	return 0;
}

上面的方法假如操作的文件中有小数部分,会忽略掉,下面这种可以正常把小数部分读取出来

int main()
{
	vector<float> V;
	vector<float> SRC_GRAY_ARR, SRC_LIGHT_ARR;
	ifstream data("***.txt", ios::in);
	float d;
	int N = 0;
	while (data >> d)
	{
		if (N % 2 == 0)
		{
			SRC_GRAY_ARR.push_back(d);
		}
		else
		{
			SRC_LIGHT_ARR.push_back(d);
		}
		N++;
	}
	data.close();

	auto it = SRC_GRAY_ARR.begin();
	auto itt = SRC_LIGHT_ARR.begin();

	for (; it != SRC_GRAY_ARR.end(), itt != SRC_LIGHT_ARR.end(); it++, itt++)
	{
		cout << *it << "    \t" << *itt << endl;
	}
	system("pause");
	return 0;
}

将opencv Mat保存为二进制文件

std::ofstream fout1("C:/Users/**.bin", std::ios::binary | std::ios::trunc);
for (int i = 0; i < map_rows; i++)
{
	for (int j = 0; j < map_cols; j++)
	{
		fout1.write(reinterpret_cast<char*>(&warp_map.at<float>(i, j)), sizeof(float));
	}
}
fout1.close();


追加文件:ios::app

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值