C语言文本文件转换为结构数组



我有一个文本文件,其中逐行包含学生编号、姓名和点。我正试图将这些行添加到结构数组中。。

Data.txt 中的示例数据

723269,Lincoln Burgess,32
543256,Amayah Burnett Bush,63
751201,Robert Downey Jr,73
...
...

我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STUDENT_SIZE 273
typedef struct {
int stNo, points;
char name[40];
} Student;
int readTxtFile(const char *filename, Student *students) {
FILE *fin = fopen(filename, "r");
if (!fin) {
printf("Can't open file: %sn", filename);
return 0;
}
int i = 0;
while (fscanf(fin, "%d,%s,%d",
&students[i].stNo,
students[i].name,
&students[i].points) == 10)
++i;
fclose(fin);
return i;
}
void printArray(Student *students, int size) {
for (int i = 0; i < size; i++) {
Student *st = &students[i];
printf("%d,%s,%dn", st->stNo, st->name, st->points);
}
}
int main() {
Student students[STUDENT_SIZE];
char myFile[] = "/Users/can/clang/practice/data.txt";
int size = readTxtFile(myFile, students);
printArray(students, size);
return 0;
}

代码没有给出错误,但没有任何内容打印到控制台。

如果您可以在系统中使用POSIX调用,则可以使用getline函数。

getline在我们必须从文件中读取行的情况下非常方便。然后,我们必须根据我们的要求解析该行。

下面我添加了适用于您要求的。

来自getline的手册页一开始就必须使用这些宏。

Since glibc 2.10:
_POSIX_C_SOURCE >= 200809L
Before glibc 2.10:
_GNU_SOURCE

#define _POSIX_C_SOURCE 200809L


int readTxtFile(const char *filename, Student *students) {
FILE *fin = fopen(filename, "r");
if (!fin) {
printf("Can't open file: %sn", filename);
return 0;
}
int i = 0;

char *lineptr = NULL;
size_t size = 0;
/*
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
while (fscanf(fin, "%d%s %d",
&students[i].stNo,
students[i].name,
&students[i].points))
*/


while(getline(&lineptr, &size,fin) != -1)
{
parse_line_to_struct_members(lineptr, &students[i].stNo, students[i].name,&students[i].points);
i++;
}
free(lineptr);
lineptr = NULL;
fclose(fin);
return i;
}
void parse_line_to_struct_members(char* line, int *num, char* name, int *points)
{
char* tok = NULL;

// stNo
tok = strtok(line, ",");
if(tok)
*num = atoi(tok);
//name
tok = strtok(NULL, ",");
if(tok)
strcpy(name, tok);

//points
tok = strtok(NULL, ",");
if(tok)
*points = atoi(tok);
}

最新更新