【问题标题】:Using read() and write() system calls使用 read() 和 write() 系统调用
【发布时间】:2012-05-13 03:17:40
【问题描述】:

所以我有一个任务,我应该使用 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的方式。

【问题讨论】:

    标签: c io


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-22
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      相关资源
      最近更新 更多