【问题标题】:system calls read and write in C系统调用在 C 中读取和写入
【发布时间】:2017-04-16 20:46:09
【问题描述】:

我想知道如何在 C 中使用系统调用 read() 和 write()。 我正在尝试将目录中预先存在的文件的内容读入缓冲区(数组),以便我可以逐步遍历数组并确定读取的文件类型。我已经查看了很多关于此事的不同帖子,但无法弄清楚我哪里出错了。我试图在底部打印出我的缓冲区数组,以确保它在单步执行文件以确定文件类型之前保存文件的正确内容,但缓冲区什么也没有。任何帮助将不胜感激。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <time.h>

int main(int argc, char *argv[])
{
    char *currentDir = NULL;
    DIR *myDir = NULL;
    struct dirent *myFile = NULL;
    struct stat myStat;

    const void *buf [1024];

    int count;
    int currentFile;

    if (strcmp(argv[1], "ls") == 0 && argc < 3)
    {
        currentDir = getenv("PWD");
        myDir = opendir(currentDir);

        while ((myFile = readdir(myDir)) != NULL)
        {
            if (myFile->d_name[0] != '.')
            {
                puts(myFile->d_name);
                //printf("%s\n", myFile->d_name);
            }
        }
        closedir(myDir);
    }

        if (strcmp(argv[1], "ls") == 0 && strcmp(argv[2], "-t") == 0)
        {
            currentDir = getenv("PWD");
            myDir = opendir(currentDir);

            while ((myFile = readdir(myDir)) != NULL)
            {
                if (myFile->d_name[0] != '.')
                {
                    printf("%s\n", myFile->d_name);
                    stat (myFile->d_name, &myStat);
                    printf("Last Accessed:\t%s\n", ctime(&myStat.st_atime));
                    printf("Last Modified:\t%s\n", ctime(&myStat.st_mtime));
                    printf("Last Changed:\t%s\n", ctime(&myStat.st_ctime));
                }
            }
            closedir(myDir);
        }

            if (strcmp(argv[1], "ls") == 0 && strcmp(argv[2], "-f") == 0)
            {
                currentDir = getenv("PWD");
                myDir = opendir(currentDir);

                while ((myFile = readdir(myDir)) != NULL)
                {
                    //while (count = read(0, buf, 100) > 0)
                    //{

                    //}
                    //write (1, buf, 100);
                    //printf ("Buffer Holds:\n %s\n", buf);
                    if (myFile->d_name[0] != '.')
                    {
                        while (count = read(myFile->d_name, buf, 100) > 0)
                            write (1, buf, count);

                        printf ("Buffer Holds:\n %s\n", buf);
                    }
                }
            }
    return 0;
}

【问题讨论】:

  • “无法弄清楚我哪里出错了。”好吧。你还没有说什么是错的。请阅读How to Ask
  • 您能否准确解释一下您认为此循环的作用以及您认为read()write() 的参数是什么(每个参数)? gist.github.com/84dac9dc427af987c0a6bee7a7b87477
  • 我认为 read 没有正确地从 myFile->d_name 指定的文件中传输位,这反过来又导致 write 没有将任何内容传输到缓冲区中。我确信 while 循环 while ((myFile = readdir(myDir)) != NULL) 正在逐步遍历目录,直到到达最后一个文件后所有文件都已“列出”,readdir 返回 0 表示目录中没有其他项目。所以我想如果我可以读取单个文件,将其写入缓冲区,对所述文件进行分类,然后 while 循环将再次迭代,允许我对所有文件进行分类,直到没有剩余。

标签: c system-calls


【解决方案1】:

你需要更多的括号:

while (count = read(myFile->d_name, buf, 100) > 0)

尝试:

while ((count = read(myFile->d_name, buf, 100)) > 0)

另外,推荐使用 sizeof:

while ((count = read(myFile->d_name, buf, sizeof(buf))) > 0)

但您已将 buf 声明为指针数组:

const void *buf [1024];

这似乎不是您真正想要的。文件中是否真的存储了指针值?我想你可能是想让buf 成为一个字符数组:

char buf[1024];

【讨论】:

  • 感谢您的回复,我会做出这些改变。我对const void *buf [1024] 的推理是,我认为如果我将 buf 设为 void 指针,它将能够接受所有类型。我认为这将允许我读取文件并将所需的任何类型写入缓冲区,即 char、int、long 等。这样我就可以读取具有相同数组的 ELF 文件、文本文件或二进制文件。
  • @Mr.Triangle 然后将其设为char *buf;void *buf; 并分配缓冲区。如果您想对缓冲区进行类型双关语,可能需要使用动态内存,否则您可能会违反 C 的别名规则。 void*char* 大部分是等价的,但 void* 具有与指向其他类型的指针的隐式转换。
【解决方案2】:

我能够弄清楚出了什么问题,我确实必须将 buf 数组更改为字符数组,但我对 read 的工作方式有一些误解。我虽然 read() 正在从文件中读取字节并将其存储到临时数组中,所以我认为我需要使用 write() 将临时数组中的信息写入我指定的数组中。实际上,read() 读取指定文件并将其内容直接存储到我的char buf [1024] 数组中,因此对write() 的调用实际上覆盖了read() 从指定文件中读取的所有信息,并存储到@ 987654327@ 数组。

谢谢大家的回复,我这里只发过1次,所以我还在努力弄清楚如何解释我遇到的问题,而不是模棱两可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 2021-08-17
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多