标签: low-level-io

使用MATLAB的Unicode路径

鉴于以下代码尝试在当前MATLAB路径中创建2个文件夹:

%%
u_path1 = native2unicode([107, 97, 116, 111, 95, 111, 117, 116, 111, 117], 'UTF-8');  % 'kato_outou'
u_path2 = native2unicode([233 129 142, 230 184 161, 229 191 156, 231 173 148], 'UTF-8');  % '????'

mkdir(u_path1);
mkdir(u_path2);
Run Code Online (Sandbox Code Playgroud)

第一个mkdir调用成功而第二个调用失败,错误消息"文件名,目录名称或卷标语法不正确".但是,在"当前文件夹"GUI面板中手动创建文件夹([右键单击]⇒新文件夹⇒[粘贴名称])遇到没有问题.这种故障的出现在最MATLAB的低级别的I/O功能(中dir,fopen,copyfile,movefile等),我想使用所有这些功能.

环境是:

  • Win7企业版(32位,NTFS)
  • MATLAB R2012a

因此文件系统支持路径中的Unicode字符,MATLAB可以存储真正的Unicode字符串(而不是"假"它们).

优雅{1}mkdir 官方文档通过声明调用该函数的正确语法来避免该问题:

mkdir('folderName')
Run Code Online (Sandbox Code Playgroud)

这表明该函数唯一官方支持的调用是使用字符串文字作为文件夹名称参数而不是字符串变量的调用.这也表明了eval我正在测试的方式,看看它是否像我写这篇文章一样有效.

我想知道是否有办法规避这些限制.我会对以下解决方案感兴趣:

  • 不依赖于未记录/不支持的MATLAB内容;

  • 不涉及系统范围的更改(例如,更改操作系统的区域设置信息);

  • 可能最终会依赖于非本机MATLAB库,只要生成的句柄/对象可以转换为MATLAB本机对象并进行操作;

  • 最终可能依赖于对标准MATLAB函数使它们可用的路径的操作,即使是特定于Windows的(例如短名称路径).

稍后编辑

我正在寻找的是以下函数的实现,这将影响已编写的代码中的原始文件:

function  listing = dir(folder); …
Run Code Online (Sandbox Code Playgroud)

unicode matlab low-level-io

12
推荐指数
1
解决办法
1084
查看次数

如何检查文件描述符是否已关闭?

在POSIX环境中使用系统调用来操作文本文件(open(), close(), read(), write())时,有没有办法检查我在使用时是否实际关闭了文件描述符close(file_descriptor)

示例:

int main(int argc, char **argv)
{
    int input_file; // file descriptor for input file
    int output_file; // file descriptor for output file
    input_file = open(argv[1], O_RDONLY));
    ouput_file = open(argv[2], ...file properties & permissions and crap.....);

    // blah blah blah...

    close(input_file);
    close(output_file);

    // what can I code here to check if the file descriptor was actually closed?
}
Run Code Online (Sandbox Code Playgroud)

c low-level low-level-code low-level-io

7
推荐指数
1
解决办法
1万
查看次数

使用Qemu的ARM程序集

好吧,我已经在整个互联网上搜索了将使用arm-linux-gnueabi-as和qemu运行的代码.要打印整数值.来自字符串.例程会有所帮助.

arm qemu low-level-code low-level-io

4
推荐指数
1
解决办法
4210
查看次数

为什么我必须使用 \x1b 而不是 \ 来表示转义字符

我读过\x1b代表转义字符,但'\'它本身不是转义字符吗?一个教程要我写

write(STDOUT_FILENO, "\x1b[2J", 4);
Run Code Online (Sandbox Code Playgroud)

清除屏幕。为什么不做'\[2J'这项工作?

c escaping control-characters low-level-io

4
推荐指数
1
解决办法
5526
查看次数

是什么导致我的程序挂起而没有正常退出?(管道,读取系统调用,while循环)

我有一个程序,我从几个子进程写入管道,然后尝试从每个管道读取写入每个进程的所有消息,并将它们打印到屏幕上.使用以下代码(具体来说,while循环使用read系统调用将消息存储到缓冲区中buf),我的程序将挂起而不退出,也不会打印发送到不同进程的所有消息.

for (i = 0; i < MAXP; i++) {
    if(id == i) {
        while(read(pfds[i][0], buf, sizeof(buf)) > 0)
             printf("process%d has received a message from %s\n",i,buf);    
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,使用以下代码,程序正确退出,但不会打印所有消息(因为它们不是全部读取):

for (i = 0; i < MAXP; i++) {
    if(id == i) {
        nbytes = read(pfds[i][0], buf, sizeof(buf));
        printf("process%d has received a message from %s\n",i,buf); 
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我写入管道的代码:

write(pfds[j][1],msg,9);  // write the message to j pipe
Run Code Online (Sandbox Code Playgroud)

并且消息是:

sprintf(msg, "process%d", i); // create the message - 9 bytes …
Run Code Online (Sandbox Code Playgroud)

c process system-calls low-level-io

3
推荐指数
1
解决办法
1982
查看次数

如何使用一次只能读取32位的方法准确读取64位寄存器值?

之前面试的时候也遇到过这个问题,但是没有得到反馈。

由于它是一个寄存器,我是否需要在访问寄存器之前禁用中断以防止数据损坏?考虑使用两个缓冲区,32 位和 64 位,并将 32 位缓冲区发送到 read32() 中,并将其相应地转移到 64 位缓冲区。我们假设这是小端架构。

我在 repl.it 上编写了一个快速示例代码(输出与寄存器值不匹配

#include <stdio.h>
#include <string.h>
#include <stdint.h>

void read32(uint64_t *reg, uint32_t *buffer){
  memcpy(buffer, reg, 4);
}

int main(void) {
  
  //register
  uint64_t reg = 0xAAAAAAAAFFFFFFFF;
  
  //buffers
  uint32_t buf_32 = 0;
  uint64_t buf_64 = 0;

  //read LSW
  read32(&reg, &buf_32);
  buf_64 |= buf_32; //add LSW

  //read MSW
  read32(&reg+4, &buf_32);
  buf_64 |= ((uint64_t)buf_32 << 32);
  
  printf("64 bit register value: 0x%lx\n", buf_64);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

64 bit register value: …
Run Code Online (Sandbox Code Playgroud)

embedded microcontroller arm low-level-io

2
推荐指数
1
解决办法
1594
查看次数

以低级别编写文件

我正在网上阅读GNU C PROGRAMMING TUTORIAL,并对低级读写的代码示例感到困惑.

代码如下:

#include <stdio.h>
#include <fcntl.h>

int main()
{
  char my_write_str[] = "1234567890";
  char my_read_str[100];
  char my_filename[] = "snazzyjazz.txt";
  int my_file_descriptor, close_err;

  /* Open the file.  Clobber it if it exists. */
  my_file_descriptor = open (my_filename, O_RDWR | O_CREAT | O_TRUNC);

 /* Write 10 bytes of data and make sure it's written */
 write (my_file_descriptor, (void *) my_write_str, 10);
 fsync (my_file_descriptor);

 /* Seek the beginning of the file */
 lseek (my_file_descriptor, 0, SEEK_SET);

 /* Read 10 bytes …
Run Code Online (Sandbox Code Playgroud)

c low-level-io

1
推荐指数
1
解决办法
42
查看次数

低级I/O的含义是什么?我如何在这个程序中实现它?

我需要编写一个接受三个命令行参数的C程序:

  1. 输入文件一
  2. 输入文件二
  3. 输出文件的名称

程序需要从文件1和2中读取数据并连接第一个文件,然后连接第二个文件,从而生成第三个文件.

这看起来应该很简单,但是赋值的一个规定是仅使用低级I/O.

究竟是什么意思(低级I/O)?

c io low-level-io

0
推荐指数
1
解决办法
1549
查看次数

成功打开()后,程序在read()上停止

我一直在我的桌子上敲我的头几个小时,试图弄清楚为什么下面的代码停滞不前while(chars = read(fd, buff, BUFF_SZ)) > 0).在printf上线直接以下不会被调用和一个正上方是.文件描述符返回0,是一个有效值.

char *infile = argv[1];
int fd,chars;

if ((fd = open(infile, O_RDONLY) < 0)) {
    perror("open()");
    exit(1);
}
printf("%s - opened (fp: %d)\n", infile, fd);
while((chars = read(fd, buff, BUFF_SZ)) > 0){
    printf("%d\n", chars);
    for(i = 0; i < chars; i++){
        c = buff[i];
        total++;
        count[c]++;
    }
}
Run Code Online (Sandbox Code Playgroud)

我甚至不知道如何调试这个,因为在该行之后没有触发任何内容,并且在此行之前一切正常.

完整的,可编辑的代码:

#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

#include <unistd.h>

#define BUFF_SZ 4096

int …
Run Code Online (Sandbox Code Playgroud)

c io low-level-io

-1
推荐指数
1
解决办法
296
查看次数