2013-11-27 66 views
1

因此,我有一個相當大的文本文件,其中包含兩列數字,我希望能夠在我正在寫作二維數組的程序中使用它。這是每次啓動我的程序時都需要訪問的數據,我覺得每次啓動程序時都必須用文件讀取器讀取數據的速度太慢/效率低下。用文本文件初始化數組的速度更快C++

所以我想知道是否有一個更容易/更有效的方式來訪問數據,而不必以傳統的方式閱讀(ifstream等)?我相信,我曾經看到類似下面的完成:

float array[]{ 
    #include "myfile.txt" 
} 

,但我也不知道這是做一個有效的事情,我找不到它的任何信息。

+0

如果您的數據格式化,它創建一個合法的數組初始化,那麼可以這樣做。當然,每次數據更改時都需要重新編譯。你有沒有嘗試在啓動時讀取文件? 「多大」有多大? –

+0

如果myfile.txt不遵循C++語法,編譯錯誤。 – deeiip

+0

myfile.txt需要什麼樣的語法?現在它只有2個垂直數字列,空格分隔列但沒有其他標點符號 – user1855952

回答

0

爲了使這項工作,你應該以一種遵循C++語法的方式來格式化你的文本文件。你可以參考一些教程,以便看到很好的例子,並描述正在發生的事情。

下面是一個簡單的例子:

  • 爲一個維陣列只需輸入與昏迷數字這樣

1.0, 3.4, 3.14, 5.56

  • 兩個和多個維度括每行中大括號{},用這樣的昏迷分隔每一列

{1.0, 3.14}, {4.1, 5.674}

上面是假設你按照你自己的

float array[] = { 
    #include "textFile.txt" 
}; 
0

例如如果你堅持包含的文件中嵌入數據的方式,你可以使用宏:

  1. 將數據寫入包含文件(在您的示例中爲「myfile.txt」,或「myfile.h」)。
  2. 寫數據在格式:

    #define DATA 1,2,3,4,5 
    

    (你可以分解成線,但保留逗號分隔的格式)。

  3. 在源文件的頂部包含「myfile.h」。

  4. 使用數據,而不是你的#include語句:

    float array[] { 
        DATA 
    }; 
    
+1

使用#define DATA而不是直接在需要的位置包含文件會有什麼意義?對我來說,這似乎更復雜 – codeling

+0

我的建議只是試圖保持現有的代碼約定,以使代碼更具可讀性。也許我錯了,但我認爲普通程序員可能會對在源文件中看到「包含」語句感到困惑。 – MaMazav

+0

但我對我而言同樣會被定義爲多個價值的定義所困惑。我最終必須做兩次查找(首先是宏定義,然後是文件內部)才能找出那裏發生了什麼,而不是一個,如果只有包含 – codeling

1

首先,你必須考慮如何2維數組聲明並初始化。 簡單;

int x[5][2] = { 
    {1, 1},  
    {2, 2},  
    {3, 3},  
    {4, 4},  
    {5, 5} 
}; 

如果數組元素來自文件,您必須創建文件exacly like; in file.txt;

{1, 1},  
{2, 2},  
{3, 3},  
{4, 4},  
{5, 5} 

遵循C++規則包含文件預處理器指令,你可以簡單的寫這樣的代碼; Source.cpp文件;

#include <iostream> 
using namespace std; 

int x[5][2] = { 
    #include "file.txt" 
}; 

int main(int argc, char* argv[]) 
{ 
    for(int i = 0; i < 5; ++i) 
    { 
     for(int j = 0; j < 2; j++)   
     { 
      cout << "x[" << i + 1 << "][" << j + 1 << "] = " << x[i][j] << " , "; 
     } 
     cout << endl; 
    } 

    return 0; 
} 
0

如果您不介意在數據更改時重新編譯,您正在以正確的方式進行。 當然,數據必須有逗號,因爲它必須是有效的C/C++語法。 所有#include確實是將該文件的內容粘貼到您的源代碼中。如果您在數據更改時不介意重新編譯,那麼您需要動態分配內存並在程序啓動時解析數據文件。 這裏需要克服的問題是,您事先不一定知道數組的大小,如果您使用動態擴展數組,您可能會浪費相當長的時間來分配和刪除內存,因爲它會增長陣列。 像往常一樣,我的解決方案是違反直覺的。 我只讀了兩次文件,一次計算了其中的數字,然後分配內存,然後再次讀取文件,將數字解析到內存中。 (如果讀取一次不會很長,也不會讀取兩次,尤其是因爲它已經在系統緩存中。)

您說數據是二維的,但是可以將它放入數組中作爲一維,只是在兩個維度訪問它,像這樣:

#define A(row,col) array[(row)*2 + (col)]