将文件拆分为相等的字节部分,用完整的单词分隔(C / C ++)

时间:2014-05-02 15:06:52

标签: c++ c linux file-io split

这就是我需要做的事情。以示例文本文件(如此)

为例
test.txt
The quick brown fox jumped over the lazy dog

我需要按字节将该文件拆分为任意除法。所以上面的文件是45个字节(包括EOL / EOF字符)。我基本上想用字节以任意方式拆分它。

因此,如果我将其分为4个部分,我会得到类似的结果:

当前

第1部分:快速b(11字节)

第2部分:rown fox ju(11字节)

第3部分:加上t(11字节)

第4部分:他懒狗(12字节)

(粗略地说是这样的)

但我想把它分成完整的单词,所以它看起来像这样

所需

第1部分:快速褐色(15字节)

第2部分:狐狸跳(9字节)

第3部分:超过(8字节)

第4部分:懒狗(9字节)

或者大致相似的东西只是因为分歧有完整的单词。如果要分割的3个单词和6个部分,前3个应该每个都有一个单词,剩下的应该只是空的。像这样:

文件:快速棕色

(分成6部分)

第1部分:

第2部分:快速

第3部分:棕色

第4-6部分:""

这就是我所拥有的,当前的"

// Get file size in bytes
off_t fileSize = statBuf.st_size;

// Split a section of file to read for each thread
off_t startSection[NUM_SECTIONS];
off_t endSection[NUM_SECTIONS];
for (int i = 0; i < NUM_SECTIONS; i++) {
    if (i == 0) {
        // Start at 0, end at our interval chunk
        startSection[i] = 0;
        endSection[i] = fileSize / NUM_SECTIONS;
    } else {
        // Start at the last section's end
        startSection[i] = endSection[i-1];
        // End after the next chunk
        endSection[i] = (fileSize / NUM_SECTIONS) * (i + 1);
    }

    // At the last section, add any remaining bytes
    if (i == NUM_SECTIONS - 1) {
        endSection[i] += fileSize % NUM_SECTIONS;
    }
}

我想我必须查看文件内容并识别空格/标点字符(我想将标点符号和空格字符视为相同)。但我无法让它以相等的部分实现(任意,可以是3部分,4,5,6等)

感谢任何帮助。这也是在Linux上。

1 个答案:

答案 0 :(得分:0)

如果您事先知道文件的大小,这个方法将是一个很好的起点,我认为(仅限C-ish伪代码):

filesize = ???;
nchunks = ???;
fileno = 1;
bytes_processed = 0;
while (bytes_processed < filesize)
{ copy_one_byte();
  if (++bytes_processed >= (filesize / nchunks * fileno))
  { // keep processing to end of word or the end of file, whichever is first
    // then switch to next file
    ++fileno;
  }
}