在C语言中使用while-loop和getw(f)!= EOF从文件中阅读整数

mw3dktmi  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(122)

我对C很陌生,或者说,非常陌生。我试着用putw()把整数写入一个文件,然后用getw()读取它们,我用一个while循环读取它们,直到EOF。但是这个循环过早地结束了,当getw()从文件中得到整数26时,它似乎就结束了。我完全不知所措。
基本上,我想使用putw将之前保存到文件中的整数打印出来(),每第7次迭代我打印一个新行。它一直工作到getw()遇到整数26,即使它不是EOF,也会终止循环.无论文件中有多少个整数,它只能在getw()遇到26之前工作。我试过使用fscanf,但也没有成功。请帮助初学者。

void readfile() {
    FILE *f;
    f = fopen("INTEGERS.DAT", "r");
    int num, xar=1;
    if (f==NULL){
        printf("NO file detected.\n");
        exit(0);
    } else {
        while((num = getw(f)) != EOF) {
            printf("%d ", num);
            if ( xar % 7 == 0) {
                printf("\n");
            }
            xar++;
        }
    }
    fclose(f);
}

先谢谢你。

vmjh9lq9

vmjh9lq91#

您没有指明数据文件的格式,但注意到您使用“r”参数打开文件,这将表明文件中的数据是文本格式而不是二进制格式。因此,使用该信息和一点艺术性许可,我创建了一个代码片段来构建一些文本数据,其中文件中每行/每条记录都有一个整数值,然后使用readfile函数的一个调整版本读取该文件中的数据。

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

void save_int(void)
{
    int entry = 999;
    FILE *fp;
    fp = fopen("INTEGERS.DAT", "w");

    if (fp != NULL)
    {
        while (1)
        {
            printf("Enter an integer or enter '0' to quit data entry: ");
            scanf("%d", &entry);

            if (entry == 0)
            {
                break;
            }

            fprintf(fp, "%d\n", entry);
        }
    }
    fclose(fp);
    return;
}

void readfile()
{
    FILE *fp;
    fp = fopen("INTEGERS.DAT", "r");
    char number[16];
    int value;
    if (fp==NULL)
    {
        printf("NO file detected.\n");
        exit(0);
    }
    else
    {
        while(1)
        {
            value = fscanf(fp, "%s", number);
            if (value < 0)
            {
                break;
            }
            printf("%d ", atoi(number));
        }
    }
    printf("\n");
    fclose(fp);
}

int main()
{
    save_int();
    readfile();
    return 0;
}

有些事项要指出。

  • 每个整数值都使用换行符写入文本文件,因此,如果您的文件实际上使用不同的格式(例如,将整数存储在同一行,并在整数值之间使用某种类型的分隔符),则需要注意这一点。
  • 在从创建的文本文件中阅读整数数据时,fscanf被用于此任务--你可能会利用其他函数(如fgets)获得建议和其他答案。有优点也有缺点,所以通常归结为你最熟悉和最舒服的方法。
  • 因为这些值是以字符串的形式存储的,所以它们被读入一个字符串,然后利用标准的atoi函数转换成一个整数。同样,这只是一个我熟悉的简单方法。无论如何,请查看您可能得到的任何替代答案和/或稍后添加到该答案的注解。

下面是终端的一些示例输出。

@Dev:~/C_Programs/Console/Integers/bin/Release$ ./Integers 
Enter an integer or enter '0' to quit data entry: 14
Enter an integer or enter '0' to quit data entry: 566
Enter an integer or enter '0' to quit data entry: 65335
Enter an integer or enter '0' to quit data entry: 122
Enter an integer or enter '0' to quit data entry: 18
Enter an integer or enter '0' to quit data entry: 0
14 566 65335 122 18 

@Dev:~/C_Programs/Console/Integers/bin/Release$ cat INTEGERS.DAT 
14
566
65335
122
18

继续进行测试,看看它是否符合项目的精神。

相关问题