使用read()系统调用

问题描述 投票:0回答:1

在课堂上的分配,我们用用read()函数读取包含数字的文件负责。虽然我能够读出的数字到缓冲区中,我一直无法将其从缓冲区移动到一个char *数组,使他们可以很容易地访问和排序。任何建议表示赞赏。

int readNumbers(int hexI, int MAX_FILENAME_LEN, int **array, char* fname) {
    int numberRead = 0, cap = 2;
    *array = (int *)malloc(cap*sizeof(int));
    int n;
    int filedesc = open(fname, O_RDONLY, 0);
    if(filedesc < 0){
        printf("%s: %s\n", "COULD NOT OPEN", fname);
        return -1;
    }
    char * buff = malloc(512);
    buff[511] = '\0';
   while(n = read(filedesc, buff+totaln, 512 - totaln) > 0) //Appears to loop only once
            totaln += n;
    int len = strlen(buff);
    for (int a = 0; a < len; a++) {  //Dynamically allocates array according to input size
        if ((&buff[a] != " ") && (&buff[a] != '\n'))
            numberRead++;
        if (numberRead >= cap){
            cap = cap*2;
            *array = (int*)realloc(*array, cap*sizeof(int));
        }
    }
    int k = 0;
    while((int *)&buff[k]){  //attempts to assign contents of buff to array
        array[k] = (int *)&buff[k];
        k++;
    }
}
c system-calls
1个回答
4
投票

您使用read()是错误的。至少有两个严重的错误:

  1. 你忽略了返回值,除了测试结束文件。
  2. 你似乎认为read()将它读取数据后追加一个空字节。甚至,它会拉长与NUL字节的缓冲区。

如果您想了解更多的数据到read()返回后,同缓冲,而不会覆盖你已经读到的东西,那么你必须通过一个指向缓冲区中的第一个可用的位置。如果你想知道多少字节合共被阅读,那么你需要添加的返回值。通常的模式是这样的:

/*
 * Read as many bytes as possible, up to buf_size bytes, from file descriptor fd
 * into buffer buf.  Return the number of bytes read, or an error code on
 * failure.
 */
int read_full(int fd, char buf[], int buf_size) {
    int total_read = 0;
    int n_read;

    while ((n_read = read(fd, buf + total_read, buf_size - total_read)) > 0) {
        total_read += n_read;
    }

    return ((n_read < 0) ? n_read : total_read);        
}

做完这些方针的东西,没有收到一个错误,你可以放心,read()没有修改超出buf[total_read - 1]缓冲区中的任何元素。这当然没有用零填充缓冲区的其余部分。

需要注意的是它并不总是必要或适宜阅读,直到缓冲区已满;例子中的功能确实是出于演示的目的,因为它似乎是你想要的。

已经这样做了,要知道,你想,好像他们是在文件中记录的二进制形式提取号码。这可能确实是这样,但如果你正在读包含格式化的数字的文本文件,那么你需要以不同的方式提取的数字。如果这就是你以后再读取最后一个字节后面添加一个字符串结束,并使用sscanf()提取号码。

© www.soinside.com 2019 - 2024. All rights reserved.