2012-09-14 83 views
2

我們調用一個庫來讀取文本,這個庫API只接受一個FILE*指針。它實際上是通過內部呼叫fread()來讀取文件文本。如何通過fread函數讀取char *字符串?

但是我們還需要使用此庫從char*字符串中讀取文本,而不是FILE*

我們當然可以寫char*串到一個臨時文件,但我們不能因爲某些原因這樣做......

怎麼辦?謝謝 !!

+0

這是什麼操作系統? – cnicutar

+1

誰說你不被允許,順便說一下?你可能需要去教育他們(比如「用大棒教育」)。 – paxdiablo

回答

4

退房fmemopen

的fmemopen()函數應與流的BUF參數給出的緩衝區關聯。

#include <stdio.h> 

static char buffer[] = "foobar"; 

int main (void) 
{ 
    FILE *stream; 

    stream = fmemopen (buffer, strlen (buffer), "r"); 

    /* You got a FILE* pointer, you can call your function here :-) */ 
} 
+1

這不是C,它是POSIX。您應該指定其不可移植性。 – paxdiablo

+1

+1,但正如@paxdiablo指出這是一個(最近的)POSIX加法。史詩提示,但感謝提到這一點。 *去尋找一個最近足夠的POSIX系統來播放*。 – unwind

-1

我不認爲這可以做到。 fread只能從文件流中讀取,即FILE *或stdout。

+0

馬尼克,我認爲你的意思'stdin',但在任何情況下,這仍然是一個'FILE *',所以多餘的:-) – paxdiablo

0

嗯,短的寫你自己的設備驅動程序與過程溝通回來,這是一個棘手的。到那個,我的意思是,你可以創建一個字符設備將其從讀出時,通過某種IPC(共享內存,命名管道,或其他東西)的通信迴流程​​。

但是,這是(1)討厭的,(2)特定於UNIX(非便攜式)和(3)一個非常糟糕的主意:-)

沒有這樣的低級伎倆(或與非便攜擴展名可以像文件句柄一樣處理內存),但這不能完成 - fread需要FILE*,並且將從文件句柄中讀取,就是這樣。

+0

不知道爲什麼你downvoted。根據您提供的標籤,這實際上是不可能的。它不能在標準C中完成,儘管在UNIX/Linux類型的系統中使用我的方法可以_possible_,但它仍然是一個壞主意。 – paxdiablo

+0

@nos,當問題只指定C(沒有像Linux這樣的限定符)時,我認爲它的含義是ISO C. – paxdiablo

0

在各種UNIX系統中,你可以創建一個管道/插座或類似的文件描述符,並使用fdopen()打開文件描述符,並得到一個FILE *指針。然後將該字符串送入管道/套接字。

我建議你查一下,當你遇到這樣奇怪的問題你的程序/庫設計。奇怪的問題/要求是糟糕設計的強烈跡象。

1

它可以完成,但它不容易,也很複雜。

您可以創建一個共享內存文件句柄與shm_open,該文件句柄可以通過mmap被用來製造它指向字符串的內存區域,然後用fdopen創建從文件描述符FILE指針。

注意:這隻適用於POSIX(例如Linux或Mac OSX)系統。 Windows系統應該具有類似的功能,但它仍然不容易。

編輯在Massimo Fazzolari的回答中引用的fmemopen調用的幕後可能會出現類似的情況。

相關問題