C 从文件中读取随机输入

C 从文件中读取随机输入,c,file,scanf,C,File,Scanf,我有一个文件,我想从文件中读取一些随机输入,我不想使用getline或类似的东西,扫描工作,但它读取一些随机的东西,比如null或不同的字符。我想问题可能是当我读一个字符时,这可能会毁掉这一切 下面是一些代码,以查看我所做的操作: #include <stdio.h> #include <stdlib.h> typedef struct queries { char type; int node; char *addr; } Queries;

我有一个文件,我想从文件中读取一些随机输入,我不想使用getline或类似的东西,扫描工作,但它读取一些随机的东西,比如null或不同的字符。我想问题可能是当我读一个字符时,这可能会毁掉这一切

下面是一些代码,以查看我所做的操作:

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

typedef struct queries
{
    char type;
    int node;
    char *addr;
} Queries;

int main()
{
    int i;
    FILE *f;

    f = fopen("queries.in", "r");

    if (!f)
    {
        fprintf(stderr, "File queries.in was not opened correctly.\n");
        exit(1);
    }

    int n_queries;

    fscanf(f, "%d\n", &n_queries);

    Queries *q = (Queries*)malloc(n_queries*sizeof(struct queries));

    for (i = 0; i < n_queries; ++i)
    {
        fscanf(f, "%c ", &q[i].type);
        if(q[i].type == 'q')  fscanf(f, "%d %s\n", &q[i].node, q[i].addr);
        else fscanf(f, "%d\n", &q[i].node);
    }

    for (i = 0; i < n_queries; ++i)
    {
        printf("%d %c ", i, q[i].type);
        if(q[i].type == 'q') printf("%d %s\n", q[i].node, q[i].addr);
        else printf("%d\n", q[i].node);
    }

    fclose(f);
}
预期产量:

8
q 0 addr2
q 0 addr1
q 0 addr1
q 1 addr4
q 1 addr1
q 1 addr2
f 4
q 1 addr4
实际产量:

0 q 0 (null)
1 a 0
2 d 0
3 d 0
4 r 2
5 q 0 (null)
6 a 0
7 d 0
我不知道当你进入q[I].addr时发生了什么

,还没有任何内存分配给q[I].addr。现在任何事情都可能发生,因为字符串被放在内存中,而不是您的内存中


您还应该检查fscanf的返回值,以确保正确读取数据。

我应该为此分配多少?与几乎无用的fprintfstderr不同,File querys.in没有正确打开。\n;试试perrorqueries,前者没有提示出了什么问题。后者告诉您文件无法打开的原因。@williampersell您好,谢谢!关于内存分配呢?我也可以在那里使用perror吗?perror可以与任何为全局errno on error赋值的函数一起使用。malloc在错误时设置errno。@williampersell您如何在malloc上使用它?遗憾的是,它通常对malloc不是特别有用,但您可以像对任何其他函数一样使用它。当分配errno on error的函数返回一个指示错误的值时,可以调用perror将与该errno值关联的系统错误消息打印到stderr。注意不要在失败的调用和对perror的调用之间更改errno,例如,如果调用printf,它可能会更改errno,这样做是一个常见的错误
0 q 0 (null)
1 a 0
2 d 0
3 d 0
4 r 2
5 q 0 (null)
6 a 0
7 d 0