【发布时间】:2020-04-23 18:05:36
【问题描述】:
我正在尝试从文件中读取一行并返回指向下一行开头的指针,但我不明白当我使用 fd 一次读取 10 个字符时发生了什么。我只能使用 read、write、open 和 malloc。
示例file.txt(明确显示\n):
Sphinx of black quartz, judge my vow.\n
Pack my box with five dozen liquor jugs.\n
The quick brown fox jumps over the lazy dog.\n
main.c:
int fd = open("file.txt", O_RDONLY);
int fd2 = open("oneline.txt", O_CREAT | O_WRONLY);
char *buffer = (char *)malloc(sizeof(char) * 10);
read(fd, buffer, 10);
write(fd2, &buffer, 10);
1) fd 现在会指向file.txt 和fd2 在oneline.txt 的EOF 的第11 个字符吗?
继续main.c示例:
int newline = 0, found = 0;
while(found == 0)
{
read(fd, buffer, 10);
for(int i = 0; buffer[i] != '\n' || i < 10; i++)
{
newline++;
if(buffer[i] == '\n')
found = 1;
}
}
如果fd 指向file.txt 中的第41 个字符(while 循环运行了4 次,'\n' 是第38 个字符)。整数 newline 的值等于 38。
2) 如何让 fd 指向 '\n' 字符之后的第 39 个字符?
【问题讨论】:
-
仅供参考,
read(fd, &buffer, 10);是错误的。那应该是read(fd, buffer, 10);。您的代码在指针本身而不是它指向的内存上爆炸,从而失去了前一个代码行(malloc)对以太的分配(从而导致内存泄漏),同时调用 未定义的行为 如果实际读取的数据量大于指针的大小。write(fd2, &buffer, 10);的类似问题,但顺序相反。 -
fd不会改变。fd是文件描述符数组的索引。该数组由操作系统保存。每个文件描述符都包含有关文件的所有信息(当文件打开时)。每个文件描述符都是一个struct。一般来说,你永远不需要知道文件描述符结构内容的细节。 -
关于:
int fd2 = open("oneline.txt", O_CREAT | O_WRONLY);创建文件时,应该包含第三个参数,通常是一个简单的八进制数,表示文件的权限 -
OT: about:
char *buffer = (char *)malloc(sizeof(char) * 10);表达式:sizeof(char)在 C 标准中定义为 1。任何东西乘以 1 都没有效果。建议删除该表达式。 2) 返回的类型是void*,可以分配给任何指针。强制转换只会使代码混乱并且容易出错。建议删除该演员表。始终检查 (!=NULL) 返回值以确保操作成功。如果不成功,拨打perror()让用户知道问题,清理并退出程序 -
fd是int,而不是任何类型的struct。没有fd.file。内核确实在幕后保留了一个struct对应于您的int的值,但您绝对无法直接访问它。
标签: c buffer system-calls file-descriptor read-write