【问题标题】:Reading random input from file从文件中读取随机输入
【发布时间】:2019-04-14 10:33:34
【问题描述】:

我有一个文件,我想从文件中读取一些随机输入,我不想使用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

预期的输出:

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

我不知道发生了什么

【问题讨论】:

  • 而不是几乎没用的fprintf(stderr, "File queries.in was not opened correctly.\n"); 尝试perror("queries.in") 前者没有提示哪里出了问题。后者告诉你文件无法打开的原因。
  • @WilliamPursell 您好,谢谢!内存分配呢?我也可以在那里使用perror 吗?
  • perror 可以与任何在出错时为全局 errno 赋值的函数一起使用。 mallocerrno 设置为错误。
  • @WilliamPursell 你如何在malloc上使用它?
  • 遗憾的是,它通常对 malloc 不是特别有用,但您可以将它与任何其他函数一起使用。当在错误时分配errno 的函数返回一个值以指示错误时,您可以调用perror 将与errno 的值关联的系统错误消息打印到stderr。注意不要在失败的调用和对perror的调用之间更改errno(例如,如果你调用printf,它可能会更改errno,这样做是一个常见的错误)

标签: c file scanf


【解决方案1】:

当你 fscanf 进入q[i].addr 时,还没有任何内存分配给q[i].addr。现在任何事情都可能发生,因为字符串被放置在不属于你的内存中。

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

【讨论】:

  • 我应该为此分配多少?
猜你喜欢
  • 2018-04-05
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多