C使用read()函数读取每行字符串

1sbrub3j  于 2023-03-22  发布在  其他
关注(0)|答案(1)|浏览(168)

我目前正在做一个任务,我们的任务是只使用系统调用来操作文件。我非常困惑,不知道如何使用C中的read()函数来读取文件中的字符串并将其存储在某个地方。例如,如果我有文件:

John 100
Sarah 200
Alex 300

我想把名字和数字存储到两个不同的变量中。类似于在fscanf中,你可以把文件中的数据读到两个变量中。我们也不允许使用结构体或类似的东西。
我用这段代码来存储名字和值

for (i = 0; strcmp(names[i], "") != 0; i++) {
            //Parses balance double into a char to store into .dat file
            snprintf(nums[i], 100, "%6.2lf", balances[i]);
            //Writing names to file
            write(fd, &names[i], strlen(names[i]));
            write(fd, " ", strlen(" "));
            //Writing balance to file
            write(fd, &nums[i], strlen(nums[i]));
            write(fd, "\n", strlen("\n"));
        }

这是我能想到的关于阅读部分的所有内容,阅读功能的资源非常有限。

char str[100];
        char num[100];
        size_t bytes = sizeof(buf);
        fd = open("gifts2.dat", O_RDWR | S_IWUSR);
        read(fd, buf, sizeof(buf));
        printf("%s", buf);
u5rb5r59

u5rb5r591#

要仅通过系统调用读取没有特定结构的文本文件,最简单的方法是一次读取一个字节:

#include <errno.h>
#include <unistd.h>

int readchar(int fd) {
    for (;;) {
        unsigned char uc;
        switch (read(fd, &uc, 1)) {
          case 0:
            return EOF;
          case 1:
            return uc;
          default:
            if (errno != EINTR)
                return EOF;
            continue;
        }
    }
}

然后,您可以像使用getc(fp)一样使用readchar(fd),并可能编写自己的readstring()和/或scanfd()函数。
如果文件具有固定格式,则可以使用read一次读取一个结构化数据块,并根据本地字节序和对齐约束调整内容。
请注意,您编写的代码似乎不正确:

  • write(fd, &names[i], strlen(names[i]));不应该使用&。如果names是一个指针数组,这将写入指针值而不是它们所指向的内容,可能会对长度超过几个字节的字符串调用未定义的行为。请使用以下命令:write(fd, names[i], strlen(names[i]));
  • write(fd, &nums[i], strlen(nums[i]));的注解相同

如果namesnums是2D char数组,代码似乎可以工作,但在这种情况下,删除&也是正确的修复方法。

相关问题