1

所以我有一个任务,我应该使用 read 和 write 从 stdin 的文件中读取行,对其进行排序,然后使用 write 将其写出到 stdout。但是,我无法让它工作。

在重新输出之前,我必须首先在 buf 上调用一个排序函数来对字符串(我使用 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);

这就是我得到buf的方式。

4

1 回答 1

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));
}

编写排序后的数据非常简单。因此,您需要专注于线路阅读器功能。

于 2012-05-23T04:47:46.680 回答