我的目的是获取文件 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++ 而不仅仅是 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/