gpt4 book ai didi

C:将文本文件读入结构数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:48 24 4
gpt4 key购买 nike

在过去的 2 天里,我一直在努力思考这个问题,但仍然不知道该怎么做。几乎我必须创建一个函数(getRawData),它传递一个指向已打开以供读取的文件的指针,并传递一个结构数组和该数组中当前的记录数(通过参数当前大小)。函数是将文件中的数据读入数组,放在数组末尾,读取后返回文件中的记录总数。我的问题是我真的不知道如何读取文件并将数据存储到数组结构中,我一直在尝试读取文件/记录,但我仍然不知道该怎么做。有问题的函数是 getRawData

整个程序实际上有两个文件而不是一个(malebabynames.csv 和 femalebabynames.csv),程序的重点是让程序向用户询问他们的名字,然后检查文件记录以查看这个名字有多受欢迎。由于某些男孩名字和女孩名字可以互换,因此需要为用户输入的每个名字读取这两个文件。这是我到目前为止的代码:

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

struct nameRecord {
char name[31];
int year;
int frequency;
};
struct nameRecord;
void allCaps(char[]);
int getRawData(FILE*, struct nameRecord[], int);
void setYearTotals(struct nameRecord[], int, int);
void setNameYearTotals(char, struct nameRecord[], int, int);
void getPerHundredThousand(int, int, double);
void printData(double);
void graphPerHundredThousand(double);

int main(void)
{
int currSizem = 0;
int currSizef = 0;
struct nameRecord records[currSizem];
FILE* fp = NULL;
FILE* fp2 = NULL;
char name[31];
printf("Please enter your name: ");
scanf("%30[^\n]", name);
printf("your name is %s\n", name);

//opening both male and female name files and reading them in order to get the total number of records in the array
fp = fopen("malebabynames.csv", "r");
if (fp != NULL) {
printf("file opened\n");
while(3 == fscanf(fp, "%[^,],%d,%d", records[currSizem].name, records[currSizem].year, records[currSizem].frequency)) {
currSizem++;
}
} else {
printf("file failed to open\n");
}

fp2 = fopen("femalebabynames.csv", "r");
if (fp != NULL) {
printf("file opened\n");
while(3 == fscanf(fp2, "%[^,],%d,%d", records[currSizef].name, &records[currSizef].year, &records[currSizef].frequency)) {
currSizef++;
}
} else {
printf("file failed to open\n");
}
return 0;
}


//function that automatically capitalizes the users inputted name
void allCaps(char s[]) {
while(*s != '\0') {
*s = toupper((unsigned char) *s);
s++;
}
}
//function that reads and places the read files into the struct arrays
int getRawData(FILE* fp, struct nameRecord records[], int currSize) {
for(i = 0; i < currSize; i++) {
fscanf(fp, "%[^,],%d,%d", records[i].name, &records[i].year, &records[i].frequency);
}
}

根据网站的具体说明:

Your program will ask the user to enter a name (you may assume that the name will be no more than 30 characters long). It will then find the popularity of the name between 1921 and 2010 and print out a chart and graph. The program will then ask the user if they wish to do another analysis and repeat the process.

该程序将从以下数据源中提取信息 确定名称的受欢迎程度。

ontario female baby names
ontario male baby names

请注意,有些名字同时被认为是男性和女性,因此您 无论名称如何,程序都需要来自两个文件的数据 进入。

由于出生人数随时间发生变化 (你预计 1945 年的出生人数比 1920),你不能简单地使用原始数字来确定 知名度。假设有 100 人出生,其中 50 人出生 1920 年命名为“迈克尔”与 1000 次出生,其中 55 名婴儿命名 1950 年的迈克尔。在这种情况下,“迈克尔”的流行实际上是 1920 年高于 1950 年。

数据集是从 1917 年到 2010 年收集的。您的程序将 确定一个名字在每十万个出生中出现的次数 从 1921 年开始每隔 5 年(您可以忽略数据 1921 年之前)。因此,如果用户输入“Allison”,您将确定 1921年到1925年、1926-1930年、1931-1935年“艾莉森”的流行度, ..., 1996-2010 (从1921年到现在共有18个五年期 和 2010 年)。您可以假设不超过 150,000 条记录 两个文件的总和。

在每种情况下,总人口是区域内所有出生人口的总和 男性和女性的年份范围。有你名字的号码 感兴趣的是在 年份范围。您的程序会将数据显示为一个值 (每十万新生儿中有这个名字的婴儿数量)和 该数据的图表。

最佳答案

您现在走在正确的轨道上,可以将文件中的每一行读入一条记录中。对于为记录数组分配内存,如果您知道(比如说)每个文件中的名称不超过 1000 个,最简单的偷懒方法就是声明 struct nameRecord records[1000]

但是如果您被明确指示记录的数量没有限制,并且程序需要在运行时弄清楚这一点,您将需要动态分配数组:

struct nameRecord *records;

...
/* after counting currSizem lines in the file */
records = malloc(currSizem * sizeof(struct nameRecord));

现在您可以重新读取该文件,知道其中的记录数量与您需要的数量完全相同。

当您不再需要records 数据时,确保调用free() 以返回您分配的内存:

free(records);

需要考虑的事项:您需要区别对待女性和男性婴儿的名字吗?或者只是衡量他们在所有婴儿中的受欢迎程度?如果需要单独检查它们,那么您将需要保留两个数组,每个文件一个。但是如果重点是将两个文件读取到一个数据结构中,那么您将需要:

  • 在数组中分配足够的内存来保存这两个文件
  • 阅读时注意重名

关于C:将文本文件读入结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com