2014-03-03 63 views
3

我有一個包含字符和數字數據的數據文件data.txt。 通常我在我的程序中使用文件流如 ifstream infile("C:\\data.txt",ios::in);然後使用infile.getline讀取這些值來讀取data.txt。將數據文件包含到C++項目中

是無論如何它可能有包含到項目data.txt文件,並與項目,這樣當我讀文件我不必擔心文件的路徑 (我的意思是我編譯 它只是使用類似ifstream的infile("data.txt",ios::in))

而且如果我可以編譯我的項目中的文件,我不會擔心 提供與我發佈一個單獨的data.txt文件,建立對任何人誰願意使用 我的計劃。

我不想將data.txt文件更改爲某種頭文件。我想保留
.txt文件,並以某種方式將其包裝在我正在構建的可執行文件中。我仍然 想要繼續使用ifstream infile("data.txt",ios::in)並從文件
中讀取行,但希望data.txt文件與其他.h或.cpp文件一樣與項目一起使用。

我正在使用C++ visual studio 2010. 這將是一種人提供一些洞察上述事情,我想 做。

更新

我設法使用下面的代碼在數據文件中的資源

HRSRC hRes = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_TEXT1), _T("TEXT")); 
DWORD dwSize = SizeofResource(GetModuleHandle(NULL), hRes); HGLOBAL hGlob = LoadResource(GetModuleHandle(NULL), hRes); 
const BYTE* pData = reinterpret_cast<const BYTE*>(::LockResource(hGlob)); 

閱讀,但我怎麼看單獨的行?不知何故,我無法閱讀單獨的行。我似乎無法區分一條線與另一條線。

+5

我認爲'資源''.rc'文件做你正在尋找。這就是我將圖像和圖標打包成Visual C++程序的方式。 http://msdn.microsoft.com/en-us/library/7zxb70x7.aspx – zero298

+2

這似乎涵蓋了幾乎所有內容:http://stackoverflow.com/questions/7366391/embedding-a-text-file-in-an -exe-which-can-be-accessible-using-fopen – Eejin

+0

@Eejin爲了讓它形成一個字符串文字,很多陷阱只是包括純文本文件。文本中包含特殊字符怎麼辦? –

回答

0

我只能給你一個解決辦法,如果你不想擔心文件的路徑,你可以: - 增加你的文件到您的項目 - 增加一個崗位建設活動,以複製您的數據.txt文件在您的生成文件夾中。

0

還有一個類似的問題,也需要將外部文件包含到C++代碼中。請檢查我的回答here。 另一種方法是將自定義資源包含在您的項目中,然後使用FindResource,LoadResource,LockResource來訪問它。

0

你可以把的std :: string變量的文件的內容:

std::string data_txt = ""; 

然後使用sscanf的或字符串流從STL解析內容。

一兩件事 - 你需要使用\字符每一個前處理特殊字符,如「'

0

對於任何類型的文件的,底座上RBerteig anwser你可以做一些簡單不過的了。與python:

該程序將生成一個text.txt。可以編譯和鏈接到您的代碼C文件,直接嵌入任何文本或二進制文件到您的exe文件,直接從變量閱讀:

import struct;     # Needed to convert string to byte 

f = open("text.txt","rb")  # Open the file in read binary mode 
s = "unsigned char text_txt_data[] = {" 

b = f.read(1)     # Read one byte from the stream 
db = struct.unpack("b",b)[0]  # Transform it to byte 
h = hex(db)      # Generate hexadecimal string 
s = s + h;      # Add it to the final code 
b = f.read(1)     # Read one byte from the stream 

while b != "": 
    s = s + ","     # Add a coma to separate the array 
    db = struct.unpack("b",b)[0] # Transform it to byte 
    h = hex(db)     # Generate hexadecimal string 
    s = s + h;     # Add it to the final code 
    b = f.read(1)    # Read one byte from the stream 

s = s + "};"      # Close the bracktes 
f.close()      # Close the file 

# Write the resultan code to a file that can be compiled 
fw = open("text.txt.c","w"); 
fw.write(s); 
fw.close(); 

會產生類似

unsigned char text_txt_data[] = {0x52,0x61,0x6e,0x64,0x6f,0x6d,0x20,0x6e,0x75... 

你可以後者在另一個c文件中使用你的數據,使用這樣的代碼變量:

extern unsigned char text_txt_data [];

現在我不能想到兩種方法將其轉換爲可讀文本。使用內存流或將其轉換爲c字符串。

+0

爲什麼所有的分號:D –

相關問題