如何读取文件直到C中的字符

时间:2013-08-17 00:25:36

标签: c file-io io fgets scanf

所以我有这个输入文件:

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; } 之后扫描整数。

3 个答案:

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