对齐大文本文件

时间:2018-10-10 18:04:52

标签: c# text memory-management

我在C#中分配了一个作业,正确性将由程序进行评估。我应该创建一个程序来获取输入文本文件,并创建一个输出文本文件,其中所有文本均由某些规则证明是正确的。第三个参数是最大文本宽度。 这些是规则:

  • 只有'\ n','\ t',''被视为空格字符('\ r'不会出现在任何地方)
  • 单词是由非空格字符组成的任何序列,在其两侧都至少有一个空格字符(或文件的开头/结尾)。
  • 空行,仅包含空格字符的行或此类行的序列是段落分隔符。每个段落分别设置格式,并且输出段落始终由单个空行分隔。段落的最后一行必须以换行符结尾,但后面不能有空行
  • 段落应包含尽可能多的单词(同时保持其顺序为c),且不超过最大文本宽度。所有单词必须用至少一个空格分隔。如果仍然有一些空白空间以实现最大文本宽度,则通过添加空格字符将其分布在单词间隙中。如果多余的空间不能均匀分布,则应从左侧开始添加。每个段落的最后一行应向左对齐(所有单词之间都必须用一个空格隔开)
  • 每行最后一个单词的最后一个字符和换行符之间没有空格字符。
  • 如果单词的字符数超过最大文本宽度,则应单独打印出一行。如果一行仅包含一个单词,则该单词应向左对齐。

现在我们不知道文本文件是否很大。我们不能保证即使只有一行也可以容纳到内存中。应该怎么做?我尝试了一些东西,但是代码太可怕了,甚至不值得显示。我(通过评估程序)通过了几次测试,但由于超出其余部分的内存限制而失败。我不一定要求代码,但是简单的伪代码可能会有所帮助。

(我尝试过的事情很简单:我尝试逐个字符地读取输入文件并计算到目前为止的内容。我将到目前为止所读取的内容保存在一个字符串中,该字符串将作为输出文件中的行,而我猜想这是错误的方法。)

1 个答案:

答案 0 :(得分:1)

由于这是一项任务,所以我会花点时间做研究...

我将使用类似的方法,该方法将数据块读取到预定义大小(小于内存限制的大小)的缓冲区中:

private void ReadInChunks()
{
    int bufferSize = 2048;
    byte[] buffer = new byte[bufferSize];

    using (FileStream fs = new FileStream(@"C:\Directory\my-file.txt", FileMode.Open))
    {
        int offset = 0;

        while (fs.Read(buffer, offset, bufferSize) > 0)
        {
            // do stuff with buffer

            offset += bufferSize;
        }
    }
}