我目前正在做一个任务,我们的任务是只使用系统调用来操作文件。我非常困惑,不知道如何使用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);
1条答案
按热度按时间u5rb5r591#
要仅通过系统调用读取没有特定结构的文本文件,最简单的方法是一次读取一个字节:
然后,您可以像使用
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]));
的注解相同如果
names
和nums
是2Dchar
数组,代码似乎可以工作,但在这种情况下,删除&
也是正确的修复方法。