2011-04-28 53 views
-1

我一直在尋找,但我從來沒有能夠挽救其他比一個座標中的任何一個2維數組你怎麼一整個陣列保存到磁盤C++

+1

要說這是一個模糊的問題,會把它放得很溫和。你使用的是什麼類型的數組,C數組,像'std :: vector'這樣的動態數組,還是別的?如果它是動態數組,你需要從保存的數據中找到大小,還是你知道它的前期?這些數組中存儲了什麼,您是否可以將這些類型的對象保存到磁盤? – sbi 2011-04-28 14:45:13

回答

1

你可以使用一個標準: :fstream或boost :: serialization。你的問題有點含糊,所以我不完全確定你想要什麼,需要什麼?

0

如果數組包含平坦數據(即,不包括指向其它數據數據)時,可以寫在單個寫入到一個文件中的整個陣列。

不知道你的數據是什麼樣的,不可能多說這些。

0

一些修修補補後,我想出了這個:

#include <cstddef> 
#include <fstream> 
#include <iostream> 


template<class T> 
void SaveArray(const std::string & file, T * data, std::size_t length) 
{ 
    std::ofstream out(file.c_str()); 
    for (std::size_t idx = 0; idx < length; ++idx) 
    { 
     if (idx != 0) 
     { 
      out << " "; 
     } 
     out << *data++; 
    } 
} 


template<class T> 
std::size_t LoadArray(const std::string & file, T * data, std::size_t length) 
{ 
    std::ifstream in(file.c_str()); 
    std::size_t count = 0; 
    while (count++ < length && in >> *data++); 
    return count - 1; // return number of items 
} 


int main() 
{ 
    int numbers[5]; 
    numbers[0] = 10; 
    numbers[1] = 11; 
    numbers[2] = 12; 
    numbers[3] = 13; 
    numbers[4] = 14; 
    SaveArray("array.txt", &numbers[0], 5); 

    int test[5]; 
    LoadArray("array.txt", &test[0], 5); 

    for (std::size_t idx = 0; idx < 5; ++idx) 
    { 
     std::cout << "test[" << idx << "]: " << test[idx] << std::endl; 
    } 
    return 0; 
} 

改進建議,歡迎選購。

2

基於StackedCrooked's idea,這裏有一個解決方案,它允許您使用C風格的std::vector數組或其他元素爲<<定義的序列。

#include <cstddef> 
#include <fstream> 
#include <iostream> 


// Beware, brain-compiled code ahead! 
template<class InpIt> 
void save_seq(const std::ostream& os, InpIt begin, InpIt end) 
{ 
    if(begin != end) 
     os << *begin++; 
    while(begin != end) 
     os << ' ' << *begin++; 
} 

template<class OutpIt> 
bool load_seq(const std::istream& is, OutpIt begin, std::size_t n) 
{ 
    for(std::size_t i=0; is && i<n; ++i) 
     is >> *begin++ 
    return is.good() || is.eof(); 
} 
template<class OutpIt> 
bool load_seq(const std::istream& is, OutpIt begin) 
{ 
    while(is.good()) 
     is >> *begin++ 
    return is.eof(); 
} 

template<class T, std::size_t N> 
void save_array(const std::ostream& os, const T (&data)[N]) 
{ 
    save_seq(os, data, data+N); 
} 


template<class T, std::size_t N> 
bool load_array(const std::istream& is, T (&data)[N]) 
{ 
    return load_seq(is, data, N); 
} 

int main() 
{ 
    const std::size_t size = 5; 
    int numbers[size]; 
    numbers[0] = 10; 
    numbers[1] = 11; 
    numbers[2] = 12; 
    numbers[3] = 13; 
    numbers[4] = 14; 
    { 
     std::oftsream ofs("array.txt"); 
     if(!ofs.good()) 
      return 1; 
     save_array(ofs, numbers); 
    } 
    { 
     std::iftsream ifs("array.txt"); 
     if(!ifs.good()) 
      return 2; 
     int test[size]; 
     load_array(ifs, test); 
     for (std::size_t idx = 0; idx < size; ++idx) 
      std::cout << "test[" << idx << "]: " << test[idx] << std::endl; 
    } 

    std::vector<int> numbers2; 
    numbers2.push_back(20); 
    numbers2.push_back(21); 
    numbers2.push_back(22); 
    numbers2.push_back(23); 
    { 
     std::oftsream ofs("array.txt"); 
     if(!ofs.good()) 
      return 1; 
     save_Seq(ofs, numbers2.begin(), numbers2.end()); 
    } 
    { 
     std::iftsream ifs("array.txt"); 
     if(!ifs.good()) 
      return 2; 
     std::vector<int> test; 
     load_seq(ifs, std::back_inserter(test)); 
     for (std::size_t idx = 0; idx < numbers2.size(); ++idx) 
      std::cout << "test[" << idx << "]: " << test[idx] << std::endl; 
    } 

    return 0; 
}