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

原帖:http://blog.csdn.net/jmy5945hh/article/details/37822805

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

 

 

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

 

char * --> std::string

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

 

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


std::string --> char *

 

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

 

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


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

 

  1. std::string str("54321");  
  2. char chs[100] = "";  
  3. int i = 0;  
  4. for(char ch : str)  
  5. {  
  6.     chs[i] = ch;  
  7.     i++;  
  8. }  

 

char * --> int

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

 

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


int --> char *

 

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

机智的办法是sprintf

 

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



 

2 文件读取数组

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

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

 

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


代码:

 

 

    1. #include <iostream>  
    2.   
    3. #define NUM_LENGTH 5  
    4.   
    5. void ReadInts(std::ifstream &in, int N, int *nums);  
    6.   
    7. int main()  
    8. {  
    9.     std::ifstream in1("1.txt");  
    10.   
    11.     if (in1)  
    12.     {  
    13.     char cnum[NUM_LENGTH];  
    14.     in1.getline(cnum, NUM_LENGTH);  
    15.     int N1 = atoi(cnum);  
    16.     int *nums = new int[N1];  
    17.   
    18.     ReadInts(in1, N1, nums);  
    19.   
    20.     int i = 0;  
    21.     for(; i < N1; i++)  
    22.     {  
    23.         std::cout << nums[i] << " ";  
    24.     }  
    25.   
    26.     std::cout << std::endl;  
    27.     delete nums;  
    28.     }  
    29. }  
    30.   
    31. void ReadInts(std::ifstream &in, int N, int *nums)  
    32. {  
    33.     char cnum[NUM_LENGTH];  
    34.   
    35.     int i;  
    36.     for (i = 0; i < N; i++)  
    37.     {  
    38.     in.getline(cnum, NUM_LENGTH, ' ');  
    39.     nums[i] = atoi(cnum);  
    40.     }  
    41. }  
posted @ 2014-09-20 10:47  我啃包子  阅读(53)  评论(0)    收藏  举报