C++ 从类型转换到文件读入数组

C++ 数据与文件操作技巧
本文介绍C++中常见的数据类型转换方法,包括char*与std::string、char*与int之间的转换,并提供文件读取的具体实例。适用于初学者及需要复习相关知识点的开发者。

很多时候,我们醉心于算法实现,研究高深的理论,却忽略了最基本的问题。这两天师兄开始华为机试,题目基本都涉及数据和文件操作,这方面自己一点儿都不熟,解决问题每次都是查,这次干脆总结下。



1 类型转换(算数类型的强制类型转换,参考C++ PRIMER 2.1.2节)


char * --> std::string

由于string支持char初始化,因此事情很好办

char chs[5] = {'1','2','3','4','5'};
std::string str(chs);

std::string --> char *

这个转换很多地方提到c_str()或者是data()函数,实际上这2个函数只能转换为const char*

std::string str("54321");
char *chs = str.c_str(); //error: invalid conversion from ‘const char*’ to ‘char*’
char *chs2 = str.data(); //error: invalid conversion from ‘const char*’ to ‘char*’

实际上,这时候较好的办法是直接在单字符层面上操作

std::string str("54321");
char chs[100] = "";
int i = 0;
for(char ch : str)
{
    chs[i] = ch;
    i++;
}


char * --> int

知道了上面两个转换后,算数类型的操作我们都在char* 层面进行

char cnum[2] = {'2','5'};
int num = atoi(cnum);

int --> char *

在csdn论坛,提到itoa的比较多,实际上,标准库里面是只有atoi,没有itoa的(比如我的Ubuntu g++就不支持)

机智的办法是sprintf

char cnum[2];
sprintf(cnum, "%d", 52);


2 文件读取数组

简单,粗暴,直接上例子。

文件格式:第一行,数据个数N,其他行,数据:

11
1 1 2 2 2 3 3 4 5 6 11

代码:

#include <iostream>

#define NUM_LENGTH 5

void ReadInts(std::ifstream &in, int N, int *nums);

int main()
{
    std::ifstream in1("1.txt");

    if (in1)
    {
	char cnum[NUM_LENGTH];
	in1.getline(cnum, NUM_LENGTH);
	int N1 = atoi(cnum);
	int *nums = new int[N1];

	ReadInts(in1, N1, nums);

	int i = 0;
	for(; i < N1; i++)
	{
	    std::cout << nums[i] << " ";
	}

	std::cout << std::endl;
	delete nums;
    }
}

void ReadInts(std::ifstream &in, int N, int *nums)
{
    char cnum[NUM_LENGTH];

    int i;
    for (i = 0; i < N; i++)
    {
	in.getline(cnum, NUM_LENGTH, ' ');
	nums[i] = atoi(cnum);
    }
}



### C++文件内容读取到数组C++ 中,可以使用多种方式将文件的内容读入数组。以下是通过 `std::ifstream` 和标准库容器来实现这一功能的例子。 #### 使用字符数组存储文件数据 当知道文件大小时,可以直接定义固定大小的字符数组并从中读取: ```cpp #include <iostream> #include <fstream> int main() { const int size = 1024; // 假设已知最大可能的文件尺寸 char buffer[size]; std::ifstream inputFile("example.txt"); if (inputFile.is_open()) { inputFile.read(buffer, sizeof(buffer)); inputFile.close(); // 输出读取的数据 std::cout.write(buffer, inputFile.gcount()); } else { std::cerr << "无法打开文件"; } } ``` 这种方法简单明了,但是存在局限性——如果文件大于预分配的空间,则会丢失部分数据;而过大的缓冲区又浪费内存资源[^1]。 #### 动态调整大小的字符串向量 更灵活的方式是利用动态增长的标准模板库(STL)中的 `vector<char>` 或者直接使用 `string` 类型作为临时缓存区域,在不知道确切字节数的情况下逐块加载整个文件至内存中: ```cpp #include <iostream> #include <fstream> #include <vector> void readFileIntoVector(const char* filename) { std::ifstream file(filename, std::ios::binary); if (!file.good()) throw std::runtime_error("Failed to open file"); // 获取文件流的位置指针并移动到最后 file.seekg(0, std::ios::end); // 获得文件大小 auto fileSize = static_cast<std::streamsize>(file.tellg()); // 返回起始位置重新设置输入位置指示器 file.seekg(0, std::ios::beg); // 创建一个足够容纳全部内容的 vector 容器 std::vector<char> buffer(fileSize); // 执行实际读操作 if (file.read(&buffer[0], fileSize)) ;// 成功读取后的处理逻辑... } int main(){ try{ readFileIntoVector("test.bin"); }catch(std::exception& e){ std::cerr<<e.what()<<'\n'; } return 0; } ``` 此代码片段展示了如何安全有效地将二进制文件完整地复制到内存中的过程。对于文本文件来说,也可以采用类似的策略,只需注意编码转换等问题即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值