【问题标题】:Algorithm with file input skipping conditions - C language具有文件输入跳过条件的算法-C语言
【发布时间】:2015-05-25 04:00:57
【问题描述】:

在浏览我们教科书中的示例和练习时,我发现了一个看似简单的问题:

将文件 input.txt 的前 K 行中的前 K 个字符复制到文件 out1.txt 中,并将行中的其余字符复制到 out2.txt 中。跳过 L 行,然后将剩余行的前 L 个字符复制到 out1.txt 中,将其余文本复制到 out2.txt 中。 同时在所有文件中保持格式(\n 字符数)相同。

我想出了以下算法并在提供的文件上对其进行了测试。 有趣的是,该程序根本不关心条件,它只是将前 K 个字符复制到 out1.txt 中,其余的复制到 out2.txt 中。 我调试程序的尝试没有成功,因为 Codebloc 似乎没有看到输入文件,并且只是跳过了整个算法,因为初始条件不满足。

这让我发疯,老实说,我看不出我做错了什么。 在你问不之前,这不是功课。

注意:i 是字符计数器,lk 是常量。

while (chr != EOF) {
    if ((line < k) && (i < k)) {
        fputc(chr, out1);
    } else
    if ((line < k) && (i > k)) {
        fputc(chr, out2);
    } else
    if ((line > (l+k)) && (i < l)) {
        fputc(chr, out1);
    } else
    if ((line > (l+k)) && (i > l)) {
        fputc(chr, out2);
    } else
    if (chr == '\n') {
        fputc(chr, out1);
        fputc(chr, out2);
        line = line + 1;
        i = 0;
    }
    i = i + 1;
    chr = fgetc(input);
}

【问题讨论】:

  • 在调试器中运行时行为可能不同,因为工作目录不同。暂时,尝试使用完整路径打开文件。
  • 你的逻辑不准确:如果i == ki == l 会发生什么?您的代码格式错误,难以阅读。 znak 是什么?您应该发布更多代码。
  • 很抱歉那个 znak 是 chr 变量的原始名称。英语不是你看到的我的第一语言。我也知道这种情况并不能涵盖一切。我的方法是首先看看我是否走在正确的轨道上,然后扩展逻辑以涵盖所有可能性。另外我会尝试放置完整的调试路径。

标签: c algorithm file loops conditional-statements


【解决方案1】:

您应该首先在循环中测试'\n'。否则,换行符将作为行的一部分输出,并且行数不会正确更新。

int chr;
int line = 0;
int i = 0;    

while ((chr = getc(input)) != EOF) {
    if (chr == '\n') {
        fputc(chr, out1);
        fputc(chr, out2);
        line = line + 1;
        i = 0;
    } else {
        if ((line < k) && (i < k)) {
            fputc(chr, out1);
        } else
        if ((line < k) && (i >= k)) {
            fputc(chr, out2);
        } else
        if ((line >= (l+k)) && (i < l)) {
            fputc(chr, out1);
        } else
        if ((line >= (l+k)) && (i >= l)) {
            fputc(chr, out2);
        }
        i = i + 1;
    }
}

【讨论】:

  • 谢谢。它现在按预期工作!想想就知道它似乎真的很明显,应该首先测试最罕见/行为异常的案例。再次感谢。
  • 不只是最罕见/奇怪的情况...您必须以不同于换行符的方式处理实际字符,因此您必须首先检查chr 属于哪个类别.如果您为处理常规字符的else 分支以不同方式嵌套它们,您也可以编写更少的测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2021-04-03
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多