微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我会得到这些看似随机的输出?

如何解决为什么我会得到这些看似随机的输出?

我遇到了一个 C 语言问题,我应该从他们各自的文件中输入玩家的姓名和年龄,并为特定数量的玩家输出相同的内容,这些玩家将被输入(或 -1 退出)。这个问题必须使用结构来解决。我附上了我正在处理的输出以及年龄和姓名文件包含的数据。

有人可以向我解释我哪里做错了吗?

任何优化方面的帮助也将非常有帮助。谢谢!

以下是代码

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

struct Cricket_Player_DataBase 
{
    char name[30];
    int score;
    char role[11];
    int age;
    int wickets;
};

int main()
{
    FILE *nf_ptr,*af_ptr; //nf_ptr is pointing to name.txt file | af_ptr is pointing to age.txt file
    
    nf_ptr = fopen("name.txt","r");
    af_ptr = fopen("age.txt","r");
    
    int number_of_players = 0; //will be used to fix the size of array of structures

// following code is used just to count number of players,upto the point where 'HERE' is written

    int temp,border_check = 0;
    
    while((temp = fgetc(af_ptr)) != EOF)
    {
        if(temp == '\n') 
        {
            ++number_of_players;
            border_check = 0;
        }
        else border_check++;
    }
    if(border_check > 0) ++number_of_players;
    
    af_ptr = fopen("age.txt","r");

// HERE
    
    struct Cricket_Player_DataBase players[number_of_players];
    
    int temp_age,zero = 0 ;
    char temp_char[30],ch ;
    
    for(int i=0; i < number_of_players; ++i)
    {
        temp_age =  fgetc(af_ptr);
        players[i].age = temp_age;
        
        while((ch = fgetc(nf_ptr)) != EOF)
        {
            if(ch == '\n')
            {
                strncpy(players[i].name,temp_char,zero+1);
                zero = 0;
                break;
            }
            else
            {
                temp_char[zero] = ch;
                zero++;
            }
        }
    }
    
    int input;
    
    printf("Enter number of players you want to see the data of OR type -1 to exit : ");
    scanf("%d",&input);
    
    if(input > 0)
    {
        for(int i = 0; i < input; ++i)
        {
            printf("Data of player #%d is \nName : %s\nAge : %d\n",i+1,players[i].name,players[i].age);
        }
    }
    
    fclose(nf_ptr);
    fclose(af_ptr);
    return 0;
}

Output 我明白了。

Name 文件就是这个。

Age 文件就是这个。

解决方法

您打开了 af_ptr 而没有关闭它。它可能会导致问题。如果您想再次打开同一个文件,请使用函数 rewind(file) 或 fclose 并再次打开它。

,

这是因为您假设文本文件中每个姓名和年龄的结尾都是换行符“\n”。假设您在 Windows 机器上创建了文本文件,行结尾是 \r\n,即 - 回车符后跟换行符。使用 Hex Editor Neo,您的文件内容如下所示。

Your name.txt file Your age.txt file

注意行尾 - '0x0d' 是回车符 '\r','0x0a' 是换行符 '\n'。修改您的程序以将其考虑在内。

在此处阅读有关行尾的更多信息:https://blog.codinghorror.com/the-great-newline-schism/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。