【问题标题】:Store Read buffer contents in string将读取缓冲区内容存储在字符串中
【发布时间】:2013-11-14 01:31:46
【问题描述】:

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

到目前为止,这会写出一些奇怪的字符,并且会额外写出内容行。
如果内容超过 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); 

【问题讨论】:

  • strlen(&dataLen) 是不可以的。相反,您应该使用sizeof(int)
  • 我假设这些是文本文件,否则请改用sizeof()
  • 对字符串也使用 sizeof?我正在测试 txt 文件,但它们也可以是二进制文件。实际上,它们只需要成为一个文件即可。该程序查看目录中的所有文件,并将每个文件的名称、权限和内容归档到一个文件中。然后我必须从中重新创建文件。
  • 如果你的文件可以是二进制的,那么strlen(data) 也不好,因为二进制数据可以包含'\0' 字符,这不会给你内容的真实长度,相反你需要保留跟踪读取的字符数,因此在 while 循环中添加一行 dataLen += len; 并删除 dataLen = strlen(data);
  • @JoeDF 我不认为sizeof(data) 会起作用,因为我相信它只会返回指针的大小而不是已读取内容量的大小。

标签: c string io


【解决方案1】:

您正在泄漏内存并超出缓冲区。这不酷。您的 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 在缓冲区之间复制数据。

【讨论】:

  • 这行得通,除了 dataLen 被写成一堆奇怪的符号。
  • 您期待什么?你正在编写一个二进制文件。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 2016-10-22
  • 2019-04-10
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2016-08-17
  • 2013-05-20
相关资源
最近更新 更多