所以我有一个赋值,我应该使用read和write来读取stdin文件中的行,对它进行排序,然后用write写出来写入stdout。但是,我无法让它发挥作用。
在重新输出之前,我必须先在buf上调用一个sort函数来对字符串(我使用read)进行排序。我可以将buf视为一个数组吗?或者它不是那样的工作?原因是我必须先对字符串进行排序。
int record_compare(const void *a, const void *b)
{
return (memcmp(a, b, num_bytes));
}
qsort(buf, num_elements, num_bytes, record_compare);
while (count < n - num_bytes)
{
i = memcmp(buf+count, buf+count + num_bytes, num_bytes);
if (i == 0)
count = count + num_bytes;
else
{
for (k = 0; k < num_bytes; k++)
{
printf("%c", buf[count]);
count++;
}
}
}
但是由于我使用read而不是fgets之类的字符串,我仍然可以将buf视为数组吗?这是排序在普通数组上的工作方式(它对它进行排序然后打印出来而不重复。
do {
c = read(0, buf+n, 1);
if (c != 0)
n++;
}
while (c != 0);
这就是我得到的方式。
答案 0 :(得分:2)
read()
系统调用将读取N个字节(每次写入代码的方式为1个字节)。在获得换行符之前,或者直到返回零字节(标记EOF)或者直到出现错误为止,您将需要进行读取。假设您找到了换行符,您将启动一个新缓冲区。
你可能有一个字符指针数组,你可能会为每一行分配一个新字符串,并将指针存储在字符指针数组中。
enum { MAX_LINES = 1024 };
char *lines[MAX_LINES];
int n_lines = 0;
我假设一个固定的上限是可以的;你也可以安排动态分配指针数组。
所以,你需要一个函数来读取一行并存储它。
然后您的比较功能出现问题。你会打电话给:
qsort(lines, n_lines, sizeof(char *), record_compare);
但record_compare()
会获得两个char **
值,因此您需要使用:
int record_compare(const void *v1, const void *v2)
{
const char *s1 = *(char **)v1;
const char *s2 = *(char **)v2;
return(strcmp(s1, s2));
}
编写排序数据非常简单。因此,您需要专注于线路阅读器功能。