使用read()函数从文件读取

Wit*_*Wit 9 c file

我必须编写一个程序,每个程序分别读取数字.是否可以只读取文件的一行,然后int从缓冲区中读取,依此类推,直到文件结束?很难找到使用读写的好例子.我的例子是有点工作,但我想阅读,直到它检测到'\n'char然后将缓冲区转换为int.

#include <fcntl.h> 
#include <stdio.h> 
#include <string.h>
#include <unistd.h> 
#include <iostream>

int fd[2];

void readFile(int fd) {
    unsigned char buffer[10];
    int bytes_read;
    int k=0;
    do {
        bytes_read = read(fd, buffer, 10); 
        k++;
            for(int i=0; i<10; i++) {
            printf("%c", buffer[i]);
        }
    }
    while (bytes_read != 0); 
}

int tab[50];

int main(int argc, char *argv[]) {
    if(argv[1] == NULL || argv[2] == NULL)   {
            printf("Function requires two arguments!\nGood bye...\n");
            return -1;
    }
    else {
        if (access(argv[1], F_OK) == 0) {
            fd[0] = open(argv[1], O_RDONLY);
        }
        else { 
            fd[0] = open(argv[1], O_WRONLY|O_CREAT|O_SYNC, 0700);
            const int size = 50;
                for(int i=0; i<size; i++) {
                    char buf[10];   
                    sprintf(buf, "%d\n", i+1);
                    write(fd[0], buf, strlen(buf));
                }
                close(fd[0]);
            fd[0] = open(argv[1], O_RDONLY);
            if (access(argv[2], F_OK) == 0) 
                fd[1] = open(argv[2], O_WRONLY);
            else 
                fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);
        }
    }

    if (access(argv[2], F_OK) == 0) 
        fd[1] = open(argv[2], O_WRONLY); 
    else 
        fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);


    readFile(fd[0]);
    close(fd[0]);
    close(fd[1]);
}
Run Code Online (Sandbox Code Playgroud)

修改后的代码:

void readFile(int fd) {
    char buffer[10];
    int bytes_read;
    int k = 0;
    do {
        char t = 0;
        bytes_read = read(fd, &t, 1); 
        buffer[k++] = t;    
        printf("%c", t);
        if(t == '\n' && t == '\0') {
            printf("%d", atoi(buffer));
            for(int i=0; i<10; i++) 
                buffer[i]='\0';
            k = 0;
        }
    }
    while (bytes_read != 0); 
}
Run Code Online (Sandbox Code Playgroud)

Gan*_*har 15

通过字节读取字节并检查每个字节是否反对'\n',buffer
如果它是'\n'添加'\0'到缓冲区然后使用,则将其存储atoi()

您可以像这样读取单个字节

char c;
read(fd,&c,1);
Run Code Online (Sandbox Code Playgroud)

看到 read()

  • 快速提问:这会比在单个 `read` 调用中读取缓冲区(字符数组),然后遍历缓冲区中的字符效率低吗?我想为每个单个字符调用 `read` 比读取缓冲区的成本更高...... (4认同)