所以我有这个输入文件:
1 2 3 4 5 6 7
3 2 4 1 6 5 7
***
1 1 2
1 1 2
***end of input***
我想扫描前两行整数,然后是它们的内容,然后跳过*
并扫描下一行整数,并对它们做一些事情(就像一个循环,直到它读取{ {1}})。
我怎么能这样做?这是我的代码:
*
所以问题是,我只能扫描前两行整数。我想在int main(){
int i = 0, j ;
int temp[100];
char c, buf[20];
FILE *fp;
fp = fopen("input.txt", "r");
if (fp != NULL){
while (1 == fscanf(fp, "%d ", &temp[i])){
i++;
}
// do something with the integers
}
else{
printf("Cannot open File!\n");
}
return 0;
}
之后扫描整数。
答案 0 :(得分:0)
也许你可以这样做(需要ctype.h):
int ch;
/* read file char by char til its end */
while ((ch = fgetc(file)) != EOF)
{
if (isdigit(ch))
{
/* char is a digit */
/* do s.th. with it */
printf("digit=%d\n", (char)ch);
}
else if (ch == '\n')
{
/* new line */
/* count lines or do s.th. else */
}
}
我不太确定,你的问题是什么。也许这对你有所帮助。
编辑:您还可以检查每个字符,如果它是带有简单if(-else)语句的'*'。
答案 1 :(得分:0)
注释:
听起来你需要(a)在做某事之后添加代码'用来处理包含星星的线条(比如用
fgets()
读取它),然后用一个又一个的循环来围绕着它,做一些事情'而且“蒙头星”'代码重复直到EOF。理想情况下,您应该在遇到EOF后关闭文件。在格式字符串中删除%d
之后的空格也是明智的 - 原因很复杂,但是尾随的空格会给交互式程序带来讨厌的行为。
概要
if (fp != NULL)
{
int c;
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
while ((c = getc(fp)) != EOF && c != '\n')
;
} while (c != EOF);
fclose(fp);
}
我不经常使用do
... while
循环,但它在这里工作正常,因为内循环的主体不会做任何愚蠢的事情(比如假设)当没有时,有有效的输入。如果有几个连续的恒星行,代码将正常工作,它们之间什么都不做(因为i
每次都为零)。
请注意,我没有使用fgets()
来阅读星系,但是可以这样做:
if (fp != NULL)
{
char line[4096];
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
} while (fgets(line, sizeof(line), fp) != 0);
fclose(fp);
}
无论使用上述两种解决方案中的哪一种,代码都以相同的方式处理样本数据:
#include <stdio.h>
static void do_something(int n, int *arr)
{
printf("data (%d items):", n);
for (int i = 0; i < n; i++)
printf(" %d", arr[i]);
putchar('\n');
}
int main(void)
{
int i = 0;
int temp[100];
FILE *fp = fopen("input.txt", "r");
if (fp != NULL)
{
char line[4096];
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
} while (fgets(line, sizeof(line), fp) != 0);
fclose(fp);
}
/*
{
int c;
do
{
i = 0;
while (fscanf(fp, "%d", &temp[i]) == 1)
i++;
if (i > 0)
do_something(i, temp);
while ((c = getc(fp)) != EOF && c != '\n')
;
} while (c != EOF);
fclose(fp);
}
*/
else
{
printf("Cannot open File!\n");
}
return 0;
}
data (14 items): 1 2 3 4 5 6 7 3 2 4 1 6 5 7
data (6 items): 1 1 2 1 1 2
答案 2 :(得分:0)
你做得很好,但唯一的一件事就是你没有读完整个文件。你可以通过像......这样的简单修改来实现这一点。
int main(){
int i = 0, j;
int temp[100];
char c, buf[20];
FILE *fp;
fp = fopen("input.txt", "r");
while ((c=getc(fp))!=EOF){ //here you are reading the whole file
while (1 == fscanf(fp, "%d ", &temp[i])){
i++;
}
// do something with the integers
}
return 0;
}