从文本文件阅读char和int- C

q8l4jmvw  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(134)

我有一个包含20行文本(编号和名称)的文本文件。我想从文本文件中读取这些内容,然后将它们用作函数中的参数。
我的文本文件包含大约20行,如下所示:

719 Chris

我有下面的代码,但它不起作用,并给出EXC_BAD_ACCESS (code=1, address=0x68)

void read() {
    int number;
    char name;
    char buffer[200];
    FILE *fp = fopen("text.txt", "r");

    while (fgets(buffer, sizeof(buffer), fp)) {
        printf("%d %s\n", &number, name);
        add(name, number)
    }
    fclose(fp);
}
acruukt9

acruukt91#

您没有检查文件是否成功打开。如果fopen返回NULL,并且该值存储在fp中,则函数调用fgets(buffer, sizeof(buffer), fp)将调用undefined behavior(即您的程序可能崩溃)。
还有,这条线

printf("%d %s\n", &number, name);

将调用未定义的行为,原因有二:

  1. %d转换格式说明符要求您传递int类型的参数,但您传递的却是int*类型的参数。
  2. %s转换格式说明符要求您传递char *类型的参数,但您传递的却是char类型的参数。
    传递name也是没有意义的,因为它从来没有被赋值过,你可能想用buffer来代替,因为它包含了你刚刚用fgets读取的行。
    我的猜测是您希望使用函数sscanf而不是printf,如下所示:
sscanf( buffer, "%d %s", &number, name);

但是,在这种情况下,必须将name更改为数组,以便它可以存储多个字符,而不是仅存储单个字符。
下面是完整的代码,它修复了上面提到的所有问题:

void read()
{
    int number;
    char name[200];
    char buffer[200];

    FILE *fp = fopen( "text.txt", "r" );
    if ( fp == NULL )
    {
        fprintf( stderr, "Error opening file!\n" );
        exit( EXIT_FAILURE );
    }

    while ( fgets( buffer, sizeof buffer, fp ) != NULL )
    {
        if ( sscanf( buffer, "%d %s", &number, name ) != 2 )
        {
            fprintf( stderr, "Parsing error!\n" );
            exit( EXIT_FAILURE );
        }

        add( name, number );
    }

    fclose(fp);
}

请注意,要使用函数exit,您必须使用#include <stdlib.h>

5uzkadbs

5uzkadbs2#

我发现有几点我觉得很奇怪:

  1. add()函数是做什么的?为什么它的末尾没有分号?(就像add(name, number);一样)
    1.您应该添加一个fclose(fp);来关闭流。
    1.在printf()中,使用标志%s来打印字符,除了%s打印字符串,替换为%c
    1.您尝试通过&number打印number的地址,但它是%p标志而不是%d标志。
  2. numbername至少在printf()中的第一次传递时看起来为空(并且未初始化!)。

相关问题