繁体   English   中英

如何从文本文件中读取数据并将其存储在我的 C 程序中以在函数中使用?

[英]How do I read data from a text file and store it in my C program to be used in functions?

我正在尝试在文本文件的同一行读取不同的数据类型,目前正在尝试通过结构将它们存储在自己的数组中。 我不确定这是否是最好的开始,但重点是从文件中读取数据并使用不同的函数对其进行操作。 我想如果我可以从文件中提取数据并将其存储在数组中,我可以将数组发送到函数中,并将数组作为参数。 这是我所拥有的,并且在主函数中解释了问题:

驱动程序文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "student_struct.c"

struct Student{
   char name[50];
   int id;
   float gpa;
   int age;
};

int main(){

FILE *fptr;
fptr = fopen("student_records.txt", "r");

if (fptr == NULL){
    printf("Error opening file!\n");
    exit(1);
}

struct Student students[100];
int i = 0;

while(!feof(fptr)){
    //PROBLEM HERE. Data for what is expected to be in the "gpa" array is always 0.
    fscanf(fptr, "%c %d %f %d", &students[i].name[i], &students[i].id, &students[i].gpa, &students[i].age);
    i++;
}

fclose(fptr);

//Always prints "0.0000"
printf("GPA of student #2: %f\n", students[1].gpa);
//avgGPA(students.gpa);

return 0;
}

功能:

#include <stdio.h>


float avgGPA(float gpa[]){

int i;

float avgGPA = 0;
for(i = 0; i < sizeof(*gpa); i++){
    avgGPA += gpa[i];
}
avgGPA = avgGPA / sizeof(*gpa);
printf("Average GPA: %f", avgGPA);

}

文本文件:

David 1234 4.0 44
Sally 4321 3.6 21
Bob 1111 2.5 20
Greg 9999 1.8 28
Heather 0000 3.2 22
Keith 3434 2.7 40
Pat 1122 1.0 31
Ann 6565 3.0 15
Mike 9898 2.0 29
Steve 1010 2.2 24
Kristie 2222 3.9 46

我的问题是,如何正确地从文件中提取数据并在不同的功能中使用它? 感谢您的帮助。

fscanf%c需要更改为%s 有关每个转换说明符的含义,请参阅fscanf 手册页 具体来说:

匹配一系列非空白字符; next 指针必须是指向字符数组的指针,该指针的长度足以容纳输入序列和自动添加的终止空字节 ('\\0')。 输入字符串在空白处或最大字段宽度处停止,以先发生者为准。

C

匹配长度由最大字段宽度(默认为 1)指定的字符序列; next 指针必须是指向 char 的指针,并且必须有足够的空间容纳所有字符(不添加终止空字节)。 前导空白的通常跳过被抑制。 要先跳过空格,请在格式中使用显式空格。

换句话说,默认情况下%c只匹配单个字符。 %s匹配多个非空白字符(即通俗的“单词”)。

其他后续问题:

  • 但是如果结构“Student”中的数组是由字符组成的,为什么它可以正确地与字符串一起使用?

    • 在 C 中,字符串被定义为以 NUL (0) 结尾的字符数组。
  • 最后,为什么这会影响操作的其余部分?

    • %c将只消耗一个字符。 这意味着下一个修饰符(在本例中为%d )将尝试与第一个单词的剩余部分匹配并失败。

应应用其他相关的最佳实践。 具体来说:

  1. 始终检查函数调用的返回值。 fscanf特别适用于这种情况。 如果这样做,您将能够看到fscanf未能匹配大多数修饰符。
  2. while !feof总是错误的。 此处未提供对此的完整解释,但请参阅其他 SO 答案,例如this
  3. 使用调试器逐步执行代码,以帮助您检查变量的状态,从而更好地了解程序在做什么以及哪里出错了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM