系统调用C语言读写

时间:2016-12-02 02:25:59

标签: c system-calls

我想知道如何在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;
}

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

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

谢谢大家的回复,我只在这里发布了另外一次,所以我仍然想弄清楚如何解释我遇到的问题而不那么含糊不清。