首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中读取结构化列表中的stdin as文件时出现问题

在C中读取结构化列表中的stdin as文件时出现问题
EN

Stack Overflow用户
提问于 2020-01-04 01:01:32
回答 2查看 58关注 0票数 1

基本上,我想要的是读取文件,在这种情况下,我使用标准输入作为我的文件FILE *f=stdin;

这些文件包含如下内容

2019 - Frog and Mouse 1982 - Water and gelly 3025 - Sugar ...

我希望能够读取和打印姓名和姓名的总字符数

到目前为止,我已经创建了一个结构和一个列表

代码语言:javascript
复制
typedef struct struct_data_uc{
    int *uc_number;
    char *uc_name;
} S_data_uc;

typedef struct List_uc_data{
    S_data_uc uc_data;
    struct List_uc_data *next;
} L_uc_data;

L_uc_data* UC_add(L_uc_data *list, L_uc_data data_uc){
    L_uc_data *new;
    new=(L_uc_data*)malloc(sizeof(L_uc_data));
    if(new!=NULL){
        (*new)=data_uc;
        new->next=list;
        return new;
    }
    return list;
}

然后,我创建了一些函数来读取列表并显示结果,还对列表进行了ree

代码语言:javascript
复制
void UC_free(L_uc_data *list){
    L_uc_data *aux;
    while(list!=NULL){
        aux=list->next;
        free(list);
        list=aux;
    }
}

void UC_read(L_uc_data *data_uc, FILE *fin, FILE *fout){
    char str[MAXSTR];
    if(fout!=NULL)
        fscanf(fin,"%d - %c",&data_uc->uc_data.uc_number,&data_uc->uc_data.uc_name);

void UC_Show(L_uc_data *data_uc, FILE *fout, int prompt){
    if(prompt==0){
        fprintf(fout,"%d - %c\n",
        data_uc->uc_data.uc_number,
        data_uc->uc_data.uc_name);
    }else{
        fprintf(fout,"%d - %c\n",
        data_uc->uc_data.uc_number,
        data_uc->uc_data.uc_name);
        }
}

比我的main

代码语言:javascript
复制
int main(){

FILE *f=stdin;
L_uc_data *list=NULL, *i, data_uc;

UC_read(&data_uc, stdin, stdout);
list=UC_add(list,data_uc);

for(i=list;i!=NULL;i=i->next)
    UC_Show(i,f,0);

    return 0;
}

但是程序似乎不起作用,有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-04 01:43:31

你的代码中有相当多的错误。我试图在不过多修改原始代码的情况下进行修复。有关详细信息,请参阅评论。

代码语言:javascript
复制
typedef struct struct_data_uc{
    int uc_number;   // Changed from int *
    char *uc_name;
} S_data_uc;

typedef struct List_uc_data{
    S_data_uc uc_data;
    struct List_uc_data *next;
} L_uc_data;

// Allocate a new L_uc_data and insert into list
L_uc_data* UC_add(L_uc_data *list, int number, const char *name)
{
    L_uc_data *new = malloc(sizeof(L_uc_data));
    if (new != NULL) {
        new->uc_data.uc_number = number;
        // Need strdup here to alloc mem and copy
        new->uc_data.uc_name = strdup(name);
        new->next = list;
        return new;
    }
    return list;
}

// Free the entire list
void UC_free(L_uc_data *list)
{
    while (list) {
        L_uc_data *aux = list->next;
        // Free the mem from strdup
        free(list->uc_data.uc_name);
        free(list);
        list = aux;
    }
}

// Reads the entire file and returns a new list
L_uc_data * UC_read(FILE *f)
{
    char line[MAXSTR];
    L_uc_data *the_list = NULL;
    // Using fgets to get the entire line, then sscanf to parse
    while (fgets(line, MAXSTR, f)) {
        int number;
        char name[MAXSTR];
        // Remember to check the return from sscanf
         if (2 == sscanf(line, "%d - %[^\n]", &number, name)) {
            // Add to list
            the_list = UC_add(the_list, number, name);
        }
    }
    return the_list;
}

// Print the entire list
void UC_show(L_uc_data *list, FILE *fout)
{
    while (list) {
        fprintf(fout, "%d - %s\n", list->uc_data.uc_number, list->uc_data.uc_name);
        list = list->next;
    }
}

int main()
{
    L_uc_data *list = UC_read(stdin);
    UC_show(list, stdout);
    UC_free(list);

    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2020-01-04 01:48:15

你正在犯(至少)2个错误。首先,将stdin作为参数传递给UC_Show,并尝试向其写入内容。其次,您没有检查printf返回的值,它几乎肯定会指示错误,并将errno设置为EBADF,以确切地告诉您错误是什么。您不能写入标准输入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59582465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档