繁体   English   中英

从文本文件的第一行读取整数数组,如果超过10则引发错误

[英]Reading array of integers from the first line of a text file and raising error if it exceeds 10

我环顾四周,还没有看到这个问题的答案。 基本上,我试图从具有整数序列(例如2 5 2 9 1 0 3 53 7)的文本文件中创建整数数组。 如果文本文件中的行超过10个整数,我想打印一条错误消息。 文本文件中只有一行。

到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *file = fopen("somenumbers.txt", "r");
    int integers[10];


    int i=0;
    int num;

    if (file == NULL)
    {
        printf("Error Reading File\n");
        exit (0);
    }

    while(fscanf(file, "%d", &num) > 0) {
        integers[i] = num;
        i++;
    }

    for (i = 0; i < 16; i++)
    {
        printf("Number is: %d\n\n", integers[i]);
    }

    fclose(file);

    return 0;
}

我应该在数组创建完成后或在通过该行的初始迭代期间检查数组的内容吗? 是否有任何函数可以轻松确定文本文件中的行是否大于limit(10)?

您必须按以下方式检查while循环;

while(fscanf(file, "%d", &num) > 0) {
    if (i >= 10) {
        printf("error\n");
        break;
    }
    integers[i++] = num;
}

您应该确保永远不要访问integers[10] ,否则它是数组越界错误,这会导致未定义的行为 (即,此后可能发生任何事情)。 因此,如果您成功读取第11个数字(该数字应为integers[10] ),则应立即停止循环。

出现错误的原因是integers数组的大小为10。由于该大小,如果读取的整数超过10,将出现段冲突问题。

要发现您有10个以上的整数,您需要了解的一个错误就是读取第11 整数。 因此,不用声明大小为10的数组,而是将其切换为11。然后,当您读取第11 整数时,您可能会显示一条错误消息并正确退出。

另外,您可能希望通过打印已读整数的数量来限制打印数字的循环。

以下是基于您的示例代码,实现了我提到的修复程序。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *file = fopen("somenumbers.txt", "r");
    int integers[11];

    int i=0, k=0;
    int num;

    if (file == NULL)
    {
        printf("Error Reading File\n");
        exit (0);
    }

    while(fscanf(file, "%d", &num) > 0) {
        integers[i] = num;
        if(k++ == 10) {
        {
            printf("Too many integers!!!\n"); /* or any other error message you'd like */
            exit (0);
        }
    }

    /* loop iterates until k integers are printed. k contains the # of integers read. */
    for (i = 0; i < k; i++)
    {
        printf("Number is: %d\n\n", integers[i]);
    }

    fclose(file);
    return 0;
}

之前检查:

...
while (fscanf(file, "%d", &num) > 0) {
        if (i >= 10) {
                /* handle error */
                break;    /* or return */
        }
        ...

防止尝试访问不存在的数组元素

您有两个错误:

1)读取时,可以将输入值写入数组边界之外

2)打印时,请确保您在阵列边界之外。

尝试以下方法:

while(fscanf(file, "%d", &num) > 0) {
    integers[i] = num;
    i++;
    if (i == 10)
    {
        break;  // Can't store more value so stop the loop using break
    }
}

// Save the number of values read
int total = i;
for (i = 0; i < total; i++)
               // ^^^^ notice
{
    printf("Number is: %d\n\n", integers[i]);
}

作为break的替代方法,您可以将i的支票置于while条件中,例如:

while(i < 10 && fscanf(file, "%d", &num) > 0) {
    //^^^^^^ notice

    integers[i] = num;
    i++;
}

您的代码有一些问题:

  • 发布的代码易于缓冲区溢出,因为您不检查是否已找到10整数。 这意味着您将访问integers[10]的边界,这只会导致未定义的行为
  • 由于要使用fscanf()一次读取一个整数,因此应使用:

     while (fscanf(file, "%d", &num) == 1) 

    代替:

     while(fscanf(file, "%d", &num) > 0) 

    fscanf()返回读取的值的数量,在这种情况下,使用1而不是> 0会更有意义。

  • 这部分:

     for (i = 0; i < 16; i++) { printf("Number is: %d\\n\\n", integers[i]); } 

    正在访问integers[10]边界integers[10] 您需要更改防护,以免超过10整数的限制。

您的代码如下所示:

#include <stdio.h>
#include <stdlib.h>

#define MAXINT 10

int main(void) {
    FILE *file;
    int integers[MAXINT], num;
    size_t count = 0;

    file = fopen("somenumbers.txt", "r");
    if (!file) {
        fprintf(stderr, "%s\n", "Error reading file");
        exit(EXIT_FAILURE);
    }

    while (fscanf(file, "%d", &num) == 1) {
        if (count == MAXINT) {
            printf("More than %d integers found!\n", MAXINT);
            exit(EXIT_FAILURE);
        }
        integers[count++] = num;
    }

    printf("Success! No more than %d integers found:\n", MAXINT);
    for (size_t i = 0; i < count; i++) {
        printf("integers[%zu] = %d\n", i, integers[i]);
    }

    fclose(file);

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM