在课堂上的分配,我们用用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++;
}
}
您使用read()
是错误的。至少有两个严重的错误:
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()
提取号码。