javascript - 如何在c++(webassembly)函数中将字符串作为文件作为javascript的参数发送?
问题描述
我在 C++ 中有一个函数,它将文件作为主函数中的参数。
int main(int argc, char **argv) {
if (argc > 1) {
auto len = std::strlen(argv[1]);
if (len >= 4 && argv[1][len-1] == 'c' && argv[1][len-2] == 'n' && argv[1][len-3] == '.') {
read_file(argv[1]);
save_all_lines();
} else {
std::fprintf(stderr, "ncc: " BOLD_RED "error" NORMAL ": unknown file format. Only files with extension 'nc' are supported\n");
return EXIT_FAILURE;
}
} else {
std::fprintf(stderr, "usage: ncc FILE\n");
return EXIT_FAILURE;
}
}
我已经将这个 c++ 程序编译成 webassembly。我想在浏览器文本区域中键入一个字符串,该字符串将作为参数发送到主函数。
我已将字符串转换为 blob(),然后将该 blob 对象转换为文件,但我应该如何在 webassembly 函数中发送文件。
#EXAMPLE IMPLEMENTATION
var contents = `
func main(){
print("hello");
}
`;
var blob = new Blob([contents], { type: "text/plain" });
var file = new File([blob], "test.nc", { type: "text/plain" });
var data = new Uint8Array(file);
Module._main(2, data);
解决方案
如果您使用的是 Emscripten,则需要使用JS 端的方法将File
对象“挂载”到模拟文件系统中。FS.mount
例如,假设默认MEMFS
文件系统仿真类型(所有内容都在内存中),示例如下所示:
FS.mount(MEMFS, { files: [file /* this is your File object */] }, '/');
然后,您可以在 C++ 端以相应的文件名访问此文件,例如在您的情况下/test.nc
。
查看链接的文档以获取更多详细信息。
推荐阅读
- angularjs - $watch 不会在指令中触发
- python - 优化 Numpy 欧几里得距离和方向函数
- javascript - 如何在 arc.centroid() 上为 D3 和弦图组弧添加标签?
- sql-server - T-SQL GroupBy 具有总计数值和基于数字范围的组平均值
- r - 调整主面板在 Shiny 中的位置
- javascript - 在新标签页中打开链接的按钮
- html - HTML/CSS 中间错误 .hover/nav 错误、@media 错误、nav/aside CIS122
- r - 获取R中括号零的两个值的索引
- python - Doc2vec 仅输出单个文档而不是两个文档向量的数据
- powerbi - Power BI - 参考结果集中的其他行以确定是否显示行