1

所以我有这个输入文件:

1 2 3 4 5 6 7
3 2 4 1 6 5 7
***
1 1 2
1 1 2
***end of input***

我想扫描前两行整数,然后对它们进行一些处理,然后跳过*并扫描下一行整数,并对它们进行一些处理(比如循环直到它读取*)。

我怎么能那样做?这是我的代码:

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;
}

所以问题是,我只能扫描前两行整数。我也想扫描之后的整数*

4

3 回答 3

1

评论:

听起来您需要(a)在“做某事”行之后添加代码以处理包含星号的行(例如使用 阅读fgets()),然后在 while、“做某事”和“咀嚼星号”周围环绕另一个循环' 重复代码直到 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
于 2013-08-17T00:59:24.010 回答
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) 语句检查每个字符,如果它是 '*'。

于 2013-08-17T00:36:21.753 回答
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;
}
于 2013-08-17T07:53:00.747 回答