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

Reading integers from a file in C using a while-loop and getw(f) != EOF

提问人:noRobotNoPro 提问时间:12/3/2022 更新时间:12/3/2022 访问量:275

问:

我对 C 很陌生,或者说,对 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);
}

提前致谢。

C 文件 while-loop 整数 EOF

评论

1赞 noRobotNoPro 12/3/2022
除了我对此非常非常陌生之外,没有其他原因。我马上试试。
1赞 Gerhardh 12/3/2022
@KamilCuk嗯。该规范提到了没有.你指的是哪个功能?另外,读取和写入整数不会很好地工作/或者我错过了什么?EOFwint_tgetwputcgetc
0赞 Steve Summit 12/3/2022
值为 26 的过早 EOF 表示您 (a) 在 Windows 上和 (b) 在文本模式下,其中 26 是 control-Z。您需要以二进制模式打开文件。.还可以在编写文件的程序中使用 ”。f = fopen("INTEGERS.DAT", "rb");"wb
0赞 Steve Summit 12/3/2022
@Gerhardh 这似乎是旧的(非常旧!getw,与宽字符或 Unicode 无关。
0赞 noRobotNoPro 12/3/2022
@SteveSummit,在使用您的解决方案对代码进行快速编辑后,我的程序现在可以按预期工作。谢谢一堆。

答:

1赞 NoDakker 12/3/2022 #1

您没有指明数据文件的格式,但请注意您正在使用“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 用于此任务 - 您可能会使用其他函数(如 fget)获得建议和其他答案。有利有弊,所以通常归结为你最熟悉和最舒服的东西。
  • 由于这些值存储为字符串值,因此它们被读入字符串,然后使用标准 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

继续测试一下,看看它是否符合你的项目精神。

评论

0赞 chux - Reinstate Monica 12/3/2022
注意:无限循环应返回非 1。scanf("%d", &entry);
0赞 chux - Reinstate Monica 12/3/2022
fscanf(fp, "%s", number);最好是.fscanf(fp, "%15s", number);