![](/img/trans.png)
[英]How do I read binary data from a text file and store it in a 2D array in 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
將只消耗一個字符。 這意味着下一個修飾符(在本例中為%d
)將嘗試與第一個單詞的剩余部分匹配並失敗。應應用其他相關的最佳實踐。 具體來說:
fscanf
特別適用於這種情況。 如果這樣做,您將能夠看到fscanf
未能匹配大多數修飾符。while !feof
總是錯誤的。 此處未提供對此的完整解釋,但請參閱其他 SO 答案,例如this 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.