⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 01 - using a c library from ruby.rb

📁 O Reilly Ruby Cookbook source code
💻 RB
字号:
#include "stdio.h"#include "ruby.h"static VALUE rb_mStdio;static VALUE rb_cStdioFile;struct file {  FILE *fhandle;};static VALUEfile_allocate(VALUE klass){  struct file *f = malloc(sizeof(*f));  f->fhandle = NULL;  return Data_Wrap_Struct(klass, file_mark, file_free, f);}static void file_mark(struct file *f){}static voidfile_free(struct file *f){  fclose(f->fhandle);  free(f);}#---static VALUEfile_open(VALUE object, VALUE fname){  struct file *f;  Data_Get_Struct(object, struct file, f);  f->fhandle = fopen(RSTRING(fname)->ptr, "r");  return Qnil;}#---static VALUEfile_readbyte(VALUE object){  char buffer[2] = { 0, 0 };  struct file *f;  Data_Get_Struct(object, struct file, f);  if (! f->fhandle)    rb_raise(rb_eRuntimeError, "Attempt to read from closed file");  fread(buffer, 1, 1, f->fhandle);  return rb_str_new2(buffer);}#---voidInit_stdio(){  rb_mStdio = rb_define_module("Stdio");  rb_cStdioFile = rb_define_class_under(rb_mStdio, "File", rb_cObject);  rb_define_alloc_func(rb_cStdioFile, file_allocate);  rb_define_method(rb_cStdioFile, "open", file_open, 1);  rb_define_method(rb_cStdioFile, "readbyte", file_readbyte, 0);}#---# extconf.rbrequire 'mkmf'dir_config("stdio")create_makefile("stdio")#---open('foo.txt', 'w') { |f| f << 'foo' }require 'stdio'f = Stdio::File.newf.open('foo.txt')f.readbyte                                     # => "f"f.readbyte                                     # => "o"f.readbyte                                     # => "o"#---

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -