簡體   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