c++ 从文件类型转换到文件读入数组
原帖:http://blog.csdn.net/jmy5945hh/article/details/37822805
很多时候,我们醉心于算法实现,研究高深的理论,却忽略了最基本的问题。这两天师兄开始华为机试,题目基本都涉及数据和文件操作,这方面自己一点儿都不熟,解决问题每次都是查,这次干脆总结下。
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);
- }
- }
浙公网安备 33010602011771号