一種方法是使用Emscripten文件系統API,例如在Module preRun函數中調用FS.init,將自定義函數作爲標準輸入傳遞。
var Module = {
preRun: function() {
function stdin() {
// Return ASCII code of character, or null if no input
}
var stdout = null; // Keep as default
var stderr = null; // Keep as default
FS.init(stdin, stdout, stderr);
}
};
功能相當低級:一次只能處理一個字符。要從BLOB讀取一些數據,你可以這樣做:
var data = new Int8Array([1,2,3,4,5]);
var blob = new Blob([array], {type: 'application/octet-binary'});
var reader = new FileReader();
var result;
reader.addEventListener("loadend", function() {
result = new Int8Array(reader.result);
});
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (if < result.byteLength {
var code = result[i];
++i;
return code;
} else {
return null;
}
}
var stdout = null; // Keep as default
var stderr = null; // Keep as default
FS.init(stdin, stdout, stderr);
}
};
注(如你暗示),由於讀者的異步性,有可能是一個競爭條件:讀者必須加載然後才能預期標準輸入的數據。您可能需要實施一些機制來避免這種情況。根據您的具體要求,你可以把這樣Emscripten程序實際上並不叫main()
,直到你擁有的數據:
var fileRead = false;
var initialised = false;
var result;
var array = new Int8Array([1,2,3,4,5]);
var blob = new Blob([array], {type: 'application/octet-binary'});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
result = new Int8Array(reader.result);
fileRead = true;
runIfCan();
});
reader.readAsArrayBuffer(blob);
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (i < result.byteLength)
{
var code = result[i];
++i;
return code;
} else{
return null;
}
}
var stdout = null;
var stderr = null;
FS.init(stdin, stdout, stderr);
initialised = true;
runIfCan();
},
noInitialRun: true
};
function runIfCan() {
if (fileRead && initialised) {
// Module.run() doesn't seem to work here
Module.callMain();
}
}
注:這是我在Providing stdin to an emscripten HTML program?回答的一個版本,但重點標準輸入,並添加關於從Blob傳遞數據的部分。
請說明您正在處理什麼類型的輸入以及您的應用程序的一般想法。 – abergmeier
INCHI圖書館:http://www.iupac.org/home/publications/e-resources/inchi/download.html,對於計算化學非常重要。輸入是molfile:http://en.wikipedia.org/wiki/Structure_data_file#Molfile我試圖從命令行程序inchi-1中導出'process_single_input'方法,您可以從第一個鏈接。 – mnowotka
你可以查看我到目前爲止在這裏:http://mnowotka.kei.pl/inchi/ 要在JavaScript控制檯中運行導出的函數類型: bla = Module.cwrap('process_single_input','string','string ')\ n bla('bla -STDIO') – mnowotka