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

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

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



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