文件读取作为资源

时间:2011-12-02 14:48:39

标签: c linux file-io

我有一个“文件”作为资源。我只能使用read()write()fstat()。这个文件是我要解析的文本文件。

通常我使用fgets()逐行读取文本文件并解析它。在这种情况下我该怎么做?

FILE *fp;
char buffer[128];

fp = fopen( "/home/txtfile", "r" );
if (fp == NULL){
    perror("file missing");
}
while (fgets (buffer, sizeof(buffer), fp) != NULL) {
       //some code
}

我如何对read()执行相同操作?

这是对的吗?

int fd = open("/dev/file",O_RDONLY);
if (fd==-1) {
    printf("Failed to open file!!!\n");
}
while (fgets (buffer, sizeof (buffer), fd) != NULL) { 
    //some code 
}

3 个答案:

答案 0 :(得分:1)

这样的事情:

int fd = open("/dev/file",O_RDONLY);
ssize_t res = 0;
while((res = read(fd, buffer, sizeof(buffer))) > 0) {
    //some code
}
if (res < 0) {
    //handle error
} else{
   //close fd
}

答案 1 :(得分:1)

除非您的文件很大,否则如果您正在使用read(),那么在整个文件中读取将更容易,然后在内存缓冲区上操作,而不是在离散块中操作。也就是说,除非每一行都是固定长度。

我会做这样的事情:

int rc;

int fd = open("data", O_RDONLY);  // open the file for reading
if (fd == -1) {
    // error
}

// to be thorough, do a stat() here to find how big to make the buffer
struct stat sb;
rc = fstat(fd, &sb);
if (rc == -1) {
    // error
}

char *buffer = calloc(1, sb.st_size);

int bytes_read = 0;
// read in entire file; each read() can be incomplete, hence why it's in a loop,
// and reading from/writing to increasing sections of the memory and file
while ((rc = read(fd, (buffer + bytes_read), (sb.st_size - bytes_read))) > 0) {
    if (rc == -1) {
        // error
    }

    bytes_read += rc;
}

close(fd);

// Now, to read it line-by-line...
char line[128]; // 128 is arbitrary
int pos = 0;
while ((rc = sscanf(buffer + pos, "%127[^\n]\n", line)) > 0) {
    pos += strlen(line) + 1;
    // do stuff with line
}

return 0;

然后,您可以通过扫描换行符或使用sscanf()逐行操作内存缓冲区。还要确保释放()你的缓冲区!

编辑:我添加了一些使用sscanf()来处理缓冲区的示例代码。如果你知道行的格式(你说你正在解析它们),你可以通过使用格式说明符更好地使用sscanf()。顺便说一下,所有这些都是未经测试的。

答案 2 :(得分:0)

  

这是对的吗?

没有

read()是一个系统调用,它在Unix文件描述符上运行,而不是stdio FILE*。除此之外,它的工作原理是从文件中读取数据并将其放入您提供的缓冲区中。

int fd = open("/dev/file",O_RDONLY);
if (fd==-1) 
{
    printf("Failed to open file!!!\n");
}
else
{
    char buffer[BUF_SIZE];
    ssize_t bytesRead = read(fd, buffer, BUF_SIZE);
    while (bytesRead > 0) 
    { 
        // do something with the buffer
        bytesRead = read(fd, buffer, BUF_SIZE);
    }
    if (bytesRead == -1)
    {
        // error
    }
    // bytesRead == 0 => end of file

}