我正在研究一个项目,我似乎无法弄清楚为什么我的查找素数的函数不能运行。本质上,我想编写代码来首先检查文本文件日志中是否有任何以前遇到的素数,但无论我为包含fscanf()的while循环放置什么,似乎我的代码都不会进入它。
int filePrime(int a) {
int hold = 0;
FILE *fp = fopen("primes.txt", "a+");
if (fp == NULL) {
printf("Error while opening file.");
exit(2);
}
/*
the while loop below this block is the one with the issue.
on first run, it should skip this loop entirely, and proceed
to finding prime numbers the old-fashioned way, while populating the file.
instead, it is skipping this loop and proceeding right into generating a
new set of prime numbers and writing them to the file, even if the previous
numbers are already in the file
*/
while (fscanf(fp, "%d", &hold) == 1){
printf("Inside scan loop.");
if (hold >= a) {
fclose(fp);
return 1;
}
if (a % hold == 0) {
fclose(fp);
return 0;
}
}
printf("Between scan and print.\n");
for (; hold <= a; hold++) {
if (isPrime(hold) == 1) {
printf("Printing %d to file\n", hold);
fprintf(fp, "%d\n", hold);
if (hold == a)
return 1;
}
}
fclose(fp);
return 0;
}
我已尝试对while循环测试进行各种更改。
防爆。 != 0,!= EOF,完全切断== 1.
我似乎无法使用fscanf让我的代码进入循环。
非常感谢任何帮助,非常感谢您的时间。
答案 0 :(得分:3)
在comment中,我询问"a+"
模式离开当前位置的位置?
在Mac OS X 10.11.4上,使用"a+"
模式打开文件并将读/写位置定位在文件末尾。
演示代码(aplus.c
):
#include <stdio.h>
int main(void)
{
const char source[] = "aplus.c";
FILE *fp = fopen(source, "a+");
if (fp == NULL)
{
fprintf(stderr, "Failed to open file %s\n", source);
}
else
{
int n;
char buffer[128];
fseek(fp, 0L, SEEK_SET);
while ((n = fscanf(fp, "%127s", buffer)) == 1)
printf("[%s]\n", buffer);
printf("n = %d\n", n);
fclose(fp);
}
return(0);
}
如果没有fseek()
,n
的返回值立即为-1(EOF)。
使用fseek()
,可以读取数据(源代码)。
有一件事让我感到困惑:我无法在POSIX fopen()
规范(或C标准)中找到信息,在使用"a+"
打开文件后提及读/写位置模式。很明显,无论fseek()
的干预用途如何,写操作都将始终结束。
POSIX规定,对open()
的调用应使用O_RDWR|O_CREAT|O_APPEND
"a+"
,open()
指定:
用于标记文件中当前位置的文件偏移量应设置为文件的开头。
附件J可移植性问题
J.3实现定义的行为
J.3.12库函数
...
附加模式流的文件位置指示符是否最初位于 文件的开头或结尾(7.21.3) ...
因此,在C标准中允许的行为是允许的。
Mac OS X上fopen()
的手册页说:
"a+"
- 开放阅读和写作。如果文件不存在,则创建该文件。流位于文件的末尾。对文件的后续写入将始终以当前文件末尾结束,无论是否有任何介入的fseek(3)或类似内容。
标准C允许这样做;它并不清楚它是否完全符合POSIX标准。