0

我正在尝试从文件中读取内容,将其存储在字符串中,获取字符串长度,写入字符串长度,然后将文件的内容写入另一个文件。实现归档#内容,其中#是内容的长度。

到目前为止,这会写出一些奇怪的字符,并且会额外写出内容行。
如果内容超过 1024,我需要继续阅读,所以我假设我写 if len == 1024 然后再次阅读并将其连接到数据。我目前还没有实现,但想在我开始让我的文件更大之前让它工作。

int file2p = open(curFilePath, O_RDONLY, 0);
if(file2p == -1){
    printf("File open error.");
    exit(1);
}
char buffer[1024];
int len;
int dataLen;
char data[1024];                
while((len = read(file2p, buffer, 1024)) != 0){ 
    if(len == -1){
        printf("File open error.\n");
        exit(1);
    }
    strcat(data, strdup(buffer));   
    printf("data: %s", data);                   
}       
dataLen = strlen(data);
int lenLen = strlen(&dataLen);
write(filep, &dataLen, lenLen);
write(filep, ">", 1);
write(filep, data, dataLen);
//free(data); 
close(file2p); 
4

1 回答 1

2

您正在泄漏内存并超出缓冲区。这不酷。您的data数组是固定大小:strcat不会使其变大。而且你不能保证缓冲区是空终止的,所以这strdup是不可能的。

你想要这样的东西:

size_t dataLen = 0;
char *data = NULL;

while( (len = read(file2p, buffer, 1024)) != 0 ){ 
    if( len == -1 ) {
        perror( "Read failed" );
        exit(1);
    }

    data = realloc( data, dataLen + len );
    if( !data ) {
        printf( "Not enough contiguous memory\n" );
        exit(1);
    }

    memcpy( &data[dataLen], buffer, len );
    dataLen += len;
}

write(filep, &dataLen, sizeof(dataLen));
write(filep, ">", 1);

if( data ) {
    write(filep, data, dataLen);
    free(data);
}

上面的代码不是最有效的方法,只是基于您现有的代码进行的说明。它根据需要动态分配和调整data缓冲区大小,并用于memcpy在缓冲区之间复制数据。

于 2013-11-14T02:41:41.880 回答