>

텍스트 파일의 같은 줄에서 다른 데이터 유형을 읽으려고 노력 중이며 현재 구조를 통해 자체 배열에 저장하려고합니다. 이것이 최선의 조치 과정인지 확실하지 않지만 요점은 파일에서 데이터를 읽고 다른 함수를 사용하여 조작하는 것입니다. 파일에서 데이터를 추출하여 배열에 저장할 수 있다면 배열을 매개 변수로 사용하여 배열을 함수에 보낼 수 있다고 생각했습니다. 다음은 내가 가진 기능이며 주요 기능 내에서 설명 된 문제입니다.

드라이버 파일 :

#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

제 질문은 파일에서 데이터를 올바르게 가져 와서 다른 기능으로 사용하는 방법입니다. 도와 주셔서 감사합니다.


  • 답변 # 1

    와이즈 비즈  와이즈 비즈   %c 로 변경해야합니다 . 각 변환 지정자가 의미하는 바는 fscanf 매뉴얼 페이지를 참조하십시오. 구체적으로 :

    와이즈 비즈 즉, fscanf  기본적으로 단일 문자 만 일치합니다. 와이즈 비즈  공백이 아닌 여러 문자 (예 : 구어체 적으로 "단어")와 일치합니다.

    다른 질문들 :

    그러나 "Student"구조의 배열이 문자로 구성된 경우 왜 문자열과 함께 올바르게 작동합니까?

    C에서 문자열은 NUL (0)로 끝나는 문자 배열로 정의됩니다.

    그러면 왜 나머지 작업에 영향을 줍니까?

    %s  한 캐릭터 만 소비합니다. 다음 수정자를 의미합니다 (

    s

    Matches a sequence of non-white-space characters; the next pointer must be a pointer to character array that is long enough to hold the input sequence and the terminating null byte ('\0'), which is added automatically. The input string stops at white space or at the maximum field width, whichever occurs first.

    c

    Matches a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to char, and there must be enough room for all the characters (no terminating null byte is added). The usual skip of leading white space is suppressed. To skip white space first, use an explicit space in the format.

    ).  이 경우)는 첫 단어의 나머지 부분과 일치 시키려고 시도하지만 실패합니다.

    관련된 다른 모범 사례를 적용해야합니다. 구체적으로 :

    <올>

    항상 함수 호출의 반환 값을 확인하십시오. 와이즈 비즈  이 경우 특히 그렇습니다. 그것이 완료되면 당신은 그 %c 를 볼 수있을 것입니다  대부분의 수정 자와 일치하지 않았습니다.

    %s  항상 잘못되었습니다. 이에 대한 자세한 설명은 여기에 제공되지 않지만 이와 같은 다른 SO 답변을 참조하십시오.

    디버거를 사용하여 코드를 단계별로 살펴보면 변수의 상태를 검사하여 프로그램이 수행하는 작업과 문제가 발생한 위치를 더 잘 이해할 수 있습니다.

    %c

  • 이전 google apps script - 파일 다운로드 URL을 얻는 방법
  • 다음 node.js - 파일과 콘솔에 동시에 ESLint 출력