c - 从文件中获取倍数并将它们复制到另一个文件中

标签 c file scanf

我的目的是获取文件 multiples.txt 中存在的所有数字,并写入所需整数(由用户输入)的倍数。

#include <stdio.h>
int main() {
    FILE *f, *fs;
    int value, multiple, n;

    f = fopen("multiples.txt", "r");

    if (f == NULL)
        printf("Error\n");

    fs = fopen("exit.txt", "w");

    if (fs == NULL)
        printf("Error\n");

    printf("Write a number\n");
    scanf("%d", &value);

    do {
        n = fscanf(f, "%d", multiple);

        if (multiple % value == 0) {
            fprintf(fs, "%d", multiple);
        }

    } while (n != EOF);

    fclose(f);
    fclose(fs);
}

我的程序崩溃了,我不知道它是从哪里来的。

最佳答案

我将假定原始 标签实际上是正确的,并给出一个答案(我认为)更好地利用了 C++ 而不仅仅是 C 的能力。

由于我们想要复制满足特定条件的项目,我们可以使用 std::copy_if 算法来处理大部分工作。我们还需要为要复制的项目指定“规则”。我们通常希望使用流而不是 C 风格的 FILE *,特别是因为后者不支持迭代器。

考虑到这些想法,我们将编写更像这样的代码:

#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>

int main() {
    std::ifstream in("multiples.txt");
    std::ofstream out("exit.txt");

    std::cout << "Enter a number: ";
    int n;
    std::cin >> n;

    std::istream_iterator<int> begin(in), end;

    std::copy_if(begin, end,
        std::ostream_iterator<int>(out),
        [n](int i) { return i % n == 0; });
}

如您所见,这消除了最初提示问题的错误机会(以及您在错误处理文件末尾时遇到的错误)。

如果您打算在 C 中完成这项工作,您通常希望将读取输入与测试输入是否成功获得一个循环相结合,该循环读取到文件末尾,然后在正确的时间停止。在这种情况下,您正在使用 fscanf 进行读取,因此正确编写循环的一种相当简单的方法如下所示:

while (1 == fscanf(f, "%d", &multiple))
    if (multiple % value == 0)
        fprintf(fs, "%d", multiple);

fscanf 的返回值是成功转换的“项目”数。在这里,我们要求读取/转换一个整数,然后测试是否发生了这种情况。

一个小的补充(适用于两者):我已经编写了上面的代码以在一个方面匹配问题中的代码:它写出结果数字,它们之间没有任何分隔符。例如,如果您有一个包含 2 4 5 8 的输入并且用户输入了 2,它将产生 248 的输出,因此在结果你将无法分辨哪些数字来自哪些输入。在实际使用中,您几乎肯定希望用某些东西(逗号、空格、换行符等)分隔它们

关于c - 从文件中获取倍数并将它们复制到另一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34602476/

相关文章:

c - 从C程序中的子程序返回数组

c++ - libdmtx 死了吗,建议更换?

ios - 如何在 Xcode 中查看我的 iOS 应用程序创建的文件/目录

javascript - 如何使用javascript将数据写入文件?I

C 编程 - Scanf 在 ubuntu 中不起作用

c - 为什么第 12 行被打印了两次?

c - 如何将 abs 和 div 与固定大小的整数一起使用

java - 如何在java中有效地读取一个巨大的文本文件并分割其内容以对其进行排序?

c - sprintf 格式 - u 之前有三个 '%%%',n 之前有两个 '%%'?

c++ - 传递三重指针以在另一个函数中分配内存,sscanf 异常