使用read()和write()系统调用

时间:2012-05-13 03:17:41

标签: c io

所以我有一个赋值,我应该使用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);

这就是我得到的方式。

1 个答案:

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

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