2013-08-20 2 views
3

Я пишу 2 программы, первая программа имеет массив целых чиселКак конвертировать строку в вектор

vector<int> v = {10, 200, 3000, 40000}; 

Затем он преобразует вектор в строку

int i; 
stringstream sw; 
string stringword; 

for (i=0;i<v.size();i++) 
{ 
    sw << v[i] << ','; 
} 
stringword = sw.str(); 
cout << "Vector in string : "<< stringword << endl; 

А потом записать его в файл

ofstream myfile; 
myfile.open ("writtentext"); 
myfile << stringword; 
myfile.close(); 

выход:

Vector in string : 10,200,3000,40000 

Вторая программа прочитает файл, преобразует строку обратно в целое, а затем вернет ее обратно в вектор.

Код:

string stringword; 

ifstream myfile; 
myfile.open ("writtentext"); 
getline (myfile,stringword); 
cout << "Read From File = " << stringword << endl; 

cout << "Convert back to vector = " ; 
for (int i=0;i<stringword.length();i++) 
{ 
    if (stringword.find(',')) 
    { 
     int value; 
     istringstream (stringword) >> value; 
     v.push_back(value); 
     stringword.erase(0, stringword.find(',')); 
    } 
} 
for (int j=0;j<v.size();j++) 
{ 
    cout << v.at(j) << " " ; 
} 

Проблема заключается в том, что может только конвертировать и оттеснить первый элемент, остальное стирается. Вот вывод:

Read From File = 10,200,3000,40000, 
Convert back to vector = 10 

Что я сделал не так? Благодаря

+0

пропустите часть строки и просто напишите вектор в файл. – andre

+1

Проверьте, что 'stringword.find (',')' возвращает (http://en.cppreference.com/w/cpp/string/basic_string/find). Если это не делает очевидным, запустите код через отладчик, и вы увидите. И пока вы на нем, проверьте также документацию для «erase»: http://en.cppreference.com/w/cpp/string/basic_string/erase. –

ответ

3

Там это проблема с вашим цикл

Рассмотрим это:

while(1) //Use a while loop, "i" isn't doing anything for you 
{ 
    //if comman not found find return string::npos 

    if (stringword.find(',')!=std::string::npos) 
    { 
     int value; 
     istringstream (stringword) >> value; 

     v.push_back(value); 

     //Erase all element including comma 
     stringword.erase(0, stringword.find(',')+1); 
    } 
    else 
     break; //Come out of loop 
} 

Вместо этого, просто использовать std::stringstream читать обратно из файла

std::stringstream ss(stringword); 
int value; 
while (ss >> value) 
{ 
    v.push_back(value); 

    if (ss.peek() == ',') 
     ss.ignore(); 
} 

for (int j=0;j<v.size();j++) //Fix variables 
{ 
    cout << v.at(j) << " " ; // Can use simply v[j] 
} 
0
for (int j=0;j<v.size();i++) 
{ 
    cout << v.at(i) << " " ; 
} 

должен быть

for (int j=0;j<v.size();j++) 
{ 
    cout << v.at(j) << " " ; 
} 

i не объявлен в for цикле

+0

Правильно, но это не проблема – P0W

0

Вы можете пропустить преобразование строки. Весь поток может обрабатывать типы int.

std::vector<int> для вывода:

#include <iostream> 
#include <iterator> 
#include <vector> 

int main() { 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(2); 
    v.push_back(3); 
    v.push_back(4); 
    std::ostream_iterator<int> output_iterator(std::cout, ","); 
    std::copy(v.begin(), v.end(), output_iterator); 
} 

вход в std::vector<int>:

#include <iostream> 
#include <vector> 
#include <sstream> 
using namespace std; 

int main() { 
    std::vector<int> v; 
    int value; 

    std::string line; 
    while(getline(cin, line, ',')) { 
     std::stringstream ss(line); 
     ss >> value 
     v.push_back(value); 
    } 
    typedef std::vector<int>::iterator iter; 
    iter end = v.end(); 
    for(iter it = v.begin(); it != end; ++it) { 
     std::cout << *it << endl; 
    } 
} 
0

это только ошибка, которую вы сделали:

for (int j=0;j<v.size();i++) 
{ 
    cout << v.at(i) << " " ; 
} 

но реализовать слишком неэффективен здесь:

for (int i=0;i<stringword.length();i++) 
{ 
    if (stringword.find(',')) 
    { 
     int value; 
     istringstream (stringword) >> value; 
     v.push_back(value); 
     stringword.erase(0, stringword.find(',')); 
    } 
} 

вы можете сделать так, просто предложение:

#include <iostream> 
#include <string> 
#include <vector> 
#include <stdlib.h> 

int ConvertStringToInt(const std::string &str, std::vector<int> &ints) 
{ 
    int count_int = 0; 
    std::string string_int; 

    size_t start = 0; 
    size_t end = 0; 

    while ((end = str.find(',', start)) != std::string::npos) 
    { 
     string_int.assign(str, start, end - start); 
     ints.push_back(atoi(string_int.c_str())); 
     start = end + 1; 
     ++count_int; 
    } 
    if (start != str.size()) 
    { 
     ints.push_back(atoi(str.c_str() + start)); 
     ++count_int; 
    } 
    return count_int; 
} 

int main(int argc, char *const argv[]) 
{ 
    std::vector<int> ints; 
    std::string str = "123,456,789 "; 
    std::cout << ConvertStringToInt(str, ints) << std::endl; 
    for (size_t i = 0; i != ints.size(); ++i) 
    { 
     std::cout << ints[i] << std::endl; 
    } 
    return 0; 
} 
0

Вы можете сделать ваши программы проще:

#include <algorithm> 
#include <fstream> 
#include <iostream> 
#include <iterator> 
#include <vector> 

// output 
int main() 
{ 
    // my compiler doesn't support initializer lists yet :(
    std::vector<int> v(4); 
    v[0] = 10; 
    v[1] = 200; 
    v[2] = 3000; 
    v[3] = 40000; 

    std::ofstream fout("mytestfile.txt"); 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(fout, ",")); 
    fout.close(); 
    return 0; 
} 

// input 
struct int_reader : std::ctype<char> 
{ 
    int_reader() : std::ctype<char>(get_table()) {} 

    static std::ctype_base::mask const* get_table() 
    { 
     static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask()); 
     rc[','] = std::ctype_base::space; 
     rc['\n'] = std::ctype_base::space; 
     return &rc[0]; 
    } 
}; 

int main() 
{ 
    std::vector<int> v; 
    std::ifstream fin("mytestfile.txt", std::ifstream::in); 
    fin.imbue(std::locale(std::locale(), new int_reader())); 
    std::copy(std::istream_iterator<int>(fin), std::istream_iterator<int>(), std::back_inserter<std::vector<int>>(v)); 
    fin.close(); 

    std::cout << "You read in: "; 
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); 
    return 0; 
} 
0

Хотя это handcrafted вместо того, чтобы использовать std::stringstream, я нахожу это довольно легко понять.

std::vector<std::string> StringToVector (const std::string s, 
             const char token) 
{ 
    std::vector<std::string> v; 

    size_t posLast = 0, pos = 0; 
    while((pos = s.find(token, pos)) != std::string::npos) 
    { 
    if(s[pos] != s[posLast]) 
     v.push_back(s.substr(posLast, pos - posLast)); 
    posLast = ++pos; 
    } 
    if(s[posLast] != 0) // If there is no terminating token found 
    v.push_back(s.substr(posLast)); 

    return v; 
} 

Demo с различными чеками.

Смежные вопросы