所以我和我的助教一直在试图找出为什么这不起作用,因为对于我的作业,我们必须使用 sprintf() 和一个全新的缓冲区来打印文本文件中的每一行。没有 sprintf() 并正常打印它,它工作得很好。
这是我的代码:
int buff = 1000;
char *ptr = mmap (NULL,buff, PROT_WRITE | PROT_READ ,MAP_PRIVATE| MAP_ANONYMOUS,0,0);
if(ptr == MAP_FAILED){
printf("Mapping Failed\n");
return 1;
}
char *oof = mmap (NULL,buff, PROT_WRITE | PROT_READ ,MAP_SHARED| MAP_ANONYMOUS,0,0);
if(oof == MAP_FAILED){
printf("Mapping Failed\n");
return 1;
}
int f1 = open("file2.txt", O_RDWR);
int fd = open("file.txt", O_RDONLY);
if(fd < 0){
printf("Uh oh u made an oopsie\n");
}else{
printf("Hey look at that it opened\n\n");
}
int length = read(fd,ptr,sizeof(char)*buff);
int count = 1;
for(int i = 0; i<length;i++){
if(ptr[i] == '\n'){
count++;
}
}
int lengths[count];
for(int i = 0;i<count;i++){
lengths[i] = 0;
}
int m = 0;
for(int i = 0;i<length;i++){
lengths[m]++;
if(ptr[i] == '\n'){
m++;
}
}
int j = 0;
int k = 0;
char **lineArray = (char **) malloc(sizeof(char *) *count);
for(int i = 0; i<count; i++){
lineArray[i] = (char *) malloc(sizeof(char)* lengths[i]);
k = 0;
while(ptr[j] != '\n')
{
lineArray[i][k] = ptr[j];
j++;
k++;
}
j++;
sprintf(oof,"\nlineArray[%d] = %s\n",i,lineArray[i]);
write(1,oof,sizeof(char)*buff);
//printf("\nlineArray[%d] = %s\n",i ,lineArray[i]);
}
我已经搞乱了这么多,我知道它与 mmap 缓冲区的东西有关,但我不知道如何修复它。
本部分:
sprintf(oof,"\nlineArray[%d] = %s\n",i,lineArray[i]);
write(1,oof,sizeof(char)*buff);
您无条件写入
buff
(=1000) 个字节,因此它可能包含前几行中的数据。
您应该从
sprintf
的返回值中获取字符串的长度,并将其用作要写入的大小:
int stringLength = sprintf(oof,"\nlineArray[%d] = %s\n",i,lineArray[i]);
if (stringLength > 0) write(1,oof,sizeof(char)*stringLength);