如何在C中传递字符串以及要由开放函数使用的文件?

时间:2019-06-24 05:35:30

标签: c

我有一个函数,将文件名作为输入并执行“打开”和“读取”调用以执行某些操作。该文件名是通过命令行参数接收的。 现在,我试图使此函数通用,以便它也可以接收字符串并执行相同的操作。换句话说,我将文件的内容直接作为字符串传递。

我不知道如何将字符串数据流式传输到“打开”功能。 另外,请注意,我只能使用打开功能来读取文件。

我尝试使用“管道”功能将数据流式传输为打开功能,但未成功。

int sopen(char *s) {
    int p[2], ret;
    int fd=-1;
    int len  = strlen(s);

    if (pipe(p) != 0) {
        fprintf(stderr, "Error in creating pipe");
        return -1;
    }

    if ((fd = open(p[0], O_RDONLY)) < 0) {
        fprintf(stderr, "Error in open");
        close(p[0]);
        close(p[1]);
        return -1;
    }

    ret = write(p[1], s, len);
    if (ret != len) {
        fprintf(stderr, "Error in writing to pipe");
        close(p[1]);
        close(fd);
        return -1;

    }
    close(p[1]);

    return fd;
}

我希望有一个文件描述符,以便打开功能可以使用它,但是它返回-1。

1 个答案:

答案 0 :(得分:1)

正如其他人所说,pipe()函数返回两个已经可以使用的描述符。这意味着pipe()已经为您打开了它们。否则,不能保证它们相互连接。

请记住,您有责任关闭它们!

您的整个解决方案都应类似于下面的伪代码:

main
   variable: fileDescriptor

   detect if command line contains a filename, or file content
   if it was a filename
      fileDecriptor = openFile(some arguments...)
   if it was a filecontent
      fileDecriptor = openAndFillPipe(some other arguments...)

   doWhetever(fileDescriptor) // here's the 'operations' on the 'file'

   close(fileDescriptor) // whatever we got, we need to clean it up


openFile(filename)
    // simply: any file-opening will do
    descriptor = open(filename, ...)


openAndFillPipe(filecontent)
    // first, make a pipe: two connected descriptors
    int pairOfDescriptors[2];
    pipe(pairOfDescriptors);

    // [0] is for reading, [1] is for writing
    write(pairOfDescriptors[1], filecontent, ...) // write as if to a file

    close(pairOfDescriptors[1])  // we DONT need the 'write' side anymore

    descriptor = pairOfDescriptors[0] // return the 'read' as if it was a file