2009-07-07 35 views
5

Tôi muốn biết cách tạo ra một mảng đôi vào ổ cứng.Làm thế nào để mảng đầu ra tăng gấp đôi vào ổ cứng?

chỉnh sửa:

để làm rõ thêm. Tôi muốn xuất nó vào một tập tin trên ổ cứng (chức năng I/O). Tốt nhất là ở định dạng tệp có thể được dịch nhanh chóng trở lại thành một mảng đôi trong chương trình khác. Nó cũng sẽ được tốt đẹp nếu nó được lưu trữ trong một cấu hình 4 byte tiêu chuẩn để tôi có thể nhìn vào nó thông qua một trình xem hex và xem các giá trị thực tế.

+1

Ý của bạn là, để xuất ra một tệp? –

+2

Vào ổ cứng? Hãy cụ thể. Để một tập tin văn bản? Ở định dạng nào? 1 trên mỗi dòng? ... –

Trả lời

13

Hey ... vì vậy bạn muốn làm điều đó trong một lần đọc/đọc, cũng không quá khó, mã sau đây sẽ hoạt động tốt, có thể cần kiểm tra thêm lỗi nhưng trường hợp dùng thử đã thành công:

#include <string> 
#include <fstream> 
#include <iostream> 

bool saveArray(const double* pdata, size_t length, const std::string& file_path) 
{ 
    std::ofstream os(file_path.c_str(), std::ios::binary | std::ios::out); 
    if (!os.is_open()) 
     return false; 
    os.write(reinterpret_cast<const char*>(pdata), std::streamsize(length*sizeof(double))); 
    os.close(); 
    return true; 
} 

bool loadArray(double* pdata, size_t length, const std::string& file_path) 
{ 
    std::ifstream is(file_path.c_str(), std::ios::binary | std::ios::in); 
    if (!is.is_open()) 
     return false; 
    is.read(reinterpret_cast<char*>(pdata), std::streamsize(length*sizeof(double))); 
    is.close(); 
    return true; 
} 

int main() 
{ 
    double* pDbl = new double[1000]; 
    int i; 
    for (i=0 ; i<1000 ; i++) 
     pDbl[i] = double(rand()); 

    saveArray(pDbl,1000,"test.txt"); 

    double* pDblFromFile = new double[1000]; 
    loadArray(pDblFromFile, 1000, "test.txt"); 

    for (i=0 ; i<1000 ; i++) 
    { 
     if (pDbl[i] != pDblFromFile[i]) 
     { 
      std::cout << "error, loaded data not the same!\n"; 
      break; 
     } 
    } 
    if (i==1000) 
     std::cout << "success!\n"; 

    delete [] pDbl; 
    delete [] pDblFromFile; 

    return 0; 
} 

Chỉ cần đảm bảo bạn phân bổ bộ đệm phù hợp! Nhưng đó là một chủ đề toàn diện.

+0

Lạ lùng lý do tại sao cái này không được bình chọn nhiều hơn, nó thực sự tốt hơn nhiều về tính di động. Cảm ơn một nhóm, nó hoạt động rất tốt và tôi đã học được một vài điều! – Faken

+0

Không chắc chắn lý do tại sao bạn nên xếp hạng cái này tốt hơn cho tính di động. Nó sử dụng cùng một đọc/ghi nhị phân như câu trả lời của tôi và tất cả các vấn đề về tính di động vẫn tồn tại. Điều này * là * một câu trả lời hoàn chỉnh hơn, là một chương trình toàn bộ chứ không chỉ là một đoạn mã. –

1
#include <fstream.h> 

void saveArray(double* array, int length); 

int main() 
{ 
    double array[] = { 15.25, 15.2516, 84.168, 84356}; 
    saveArray(array, 4); 

    return 0; 
} 

void saveArray(double* array, int length) 
{ 
    ofstream output("output.txt"); 

    for(int i=0;i<length;i++) 
    { 
     output<<array[i]<<endl; 
    } 
} 

đây là cách để tạo ra một mảng tăng gấp đôi thành tệp văn bản trên mỗi dòng. hy vọng điều này sẽ giúp
CHỈNH SỬA
Thay đổi một dòng trên thành hai dòng này và nó sẽ biên dịch trong VS. Bạn có thể sử dụng đa luồng để không gây cản trở lưu dữ liệu hệ thống mưu chước

#include <fstream> 

using namespace std; 
+0

Hmm, cảm ơn phản hồi của bạn. Nó không có vẻ biên dịch trên VC của tôi + + vì một lý do nào đó. Mặc dù nó không biên dịch, vẫn có vấn đề sử dụng vòng lặp để xuất tất cả mọi thứ. Theo kinh nghiệm của tôi, nó chậm hơn nhiều so với việc sử dụng .write(). Vì tôi đang xuất hàng triệu đôi, nó sẽ rất chậm, tôi cần cái gì đó nhanh và hiệu quả! – Faken

+0

xem bài chỉnh sửa, để biên dịch trong VS –

-1
#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 
    double [] theArray=...; 
    int arrayLength=...; 
    ofstream myfile; 
    myfile.open ("example.txt"); 
    for(int i=0; i<arrayLength; i++) { 
    myfile << theArray[i]<<"\n"; 
    } 
    myfile.close(); 
    return 0; 
} 

chuyển thể từ http://www.cplusplus.com/doc/tutorial/files/

Chỉ cần thiết lập theArray và arrayLength để bất cứ điều gì mã của bạn đòi hỏi.

+1

Bạn có nghĩa là myfile << theArray [i] << "\ n"; ? Nếu không, bạn sẽ chỉ liên tục in chữ "theArray [i]". –

+0

Có phương pháp nào khác ngoài việc xuất từng phần tử riêng lẻ không? Ứng dụng của tôi quá chậm. Có một số cách để nói với máy tính: "hey! Lấy những thứ các mảng đôi được lưu trữ trên trong RAM và chỉ cần đổ nó vào một tập tin và tát một txt vào cuối của nó". – Faken

+0

Nếu viết mỗi phần tử quá chậm, tại sao không chỉ xây dựng một chuỗi các mục và viết một chuỗi đó vào đĩa? –

4

Bạn có thể sử dụng iostream .read() và .write().

Nó hoạt động (rất gần!) Như thế này:

double d[2048]; 
fill(d, d+2048, 0); 
ofstream outfile ("save.bin", ios::binary); 
outfile.write(reinterpret_cast<char*>(&d), sizeof(d)); 

ifstream infile ("save.bin", ios::binary); 
infile.read(reinterpret_cast<char*>(&d), sizeof(d)); 

Lưu ý rằng đây là không di giữa kiến ​​trúc CPU. Một số có thể có các kích thước khác nhau của đôi. Một số có thể lưu trữ các byte trong một đơn đặt hàng khác nhau khác nhau. Nó không nên được sử dụng cho các tệp dữ liệu di chuyển giữa các máy hoặc dữ liệu được gửi qua mạng.

+0

Tôi sẽ in đậm toàn bộ câu đầu tiên của tuyên bố từ chối trách nhiệm của bạn. –

+0

Tôi biết điều này là cầu kỳ, nhưng tệp phải là * .txt nếu bạn đang lưu dưới dạng nhị phân. – Zack

+0

có nghĩa là để nói _shouldn't_ là * .txt – Zack

4

Sử dụng tiêu chuẩn :: copy() với trình lặp dòng. Bằng cách này, nếu bạn thay đổi 'dữ liệu' thành một loại khác thì các thay đổi đối với mã sẽ là tầm thường.

#include <algorithm> 
#include <iterator> 
#include <fstream> 

int main() 
{ 
    double   data[1000] = {/*Init Array */}; 

    { 
     // Write data too a file. 
     std::ofstream outfile("data"); 
     std::copy(data, 
        data+1000, 
        std::ostream_iterator<double>(outfile," ") 
       ); 
    } 

    { 
     // Read data from a file 
     std::ifstream infile("data"); 
     std::copy(std::istream_iterator<double>(infile), 
        std::istream_iterator<double>(), 
        data // Assuming data is large enough. 
       ); 
    } 
} 
+0

Tôi thích phong cách này nhưng nó thậm chí còn tốt hơn nếu bạn sử dụng một vector thay vì một mảng và back_inserter (dữ liệu) thay vì dữ liệu trong bản sao từ ifstream. –

+0

Hoặc một danh sách hoặc một bộ hoặc bất kỳ thứ gì khác. Tất cả họ chỉ làm việc với sự thay đổi nhỏ. –

0

Bây giờ tôi cảm thấy cũ. Tôi đã hỏi câu hỏi này một thời gian dài trước đây (ngoại trừ ints). comp.lang.c++ link

Các vấn đề liên quan