在讨论解决方案之前,我想指出一个数组只能有一个类型。您不能将整数存储在字符数组中。
意思是如果您希望所有这些信息都放在一个二维数组中,则需要将 ID 存储为字符串。然后,如果您需要它作为整数,则需要在检索到它后使用atoi。
现在要将两者结合起来,您需要一个带有fgets 的while 循环,以便检索第一行。像这样的:
while(fgets(schoolname, 255, fp) != 0){ ... }
这将继续检索行,直到它失败或到达 EOF。但是,您想在第二行使用fscanf,为此,您需要这样的一行:
fscanf(fp, "%s %s\n", name, id);
这意味着,从当前点开始,有两个字符串由空格和换行符分隔。将这两个字符串存储在name 和id 中,然后吞噬换行符。
吞噬换行符是关键,如果你不这样做,下次fgets 运行时,它只会在行上找到一个换行符。
至于将元素存储在数组中,您需要一个二维字符串数组。为此,您可以固定或动态进行。对于固定,这很容易,只需要像char students[3][3][80] 这样的一行,然后在其中简单地存储东西,但对于动态,您需要使用内存分配、指针等,以及变量喜欢char ***students
这是我用来解决您的问题的代码,但我建议您也尝试自己做,以掌握它:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
FILE *fp = fopen("ex.txt", "r");
if(fp == 0) exit(-1);
char ***students;
// Used to check how many students there are
int studentno = 0;
// Init students array
// So far it means 1 ROW, with 3 COLUMNS, each of 80 CHARACTERS
students = calloc(studentno+1, 3 * 80);
// Temporary variables for storage
char schoolname[80];
char name[20];
char id[10];
int i = 0;
while(fgets(schoolname, 255, fp) != 0){
studentno++;
// Retrieve name and id from second line
fscanf(fp, "%s %s\n", name, id);
// Cut off newline left from fgets
schoolname[strlen(schoolname)-2] = 0;
// Allocate memory for new members of array
students[i] = malloc(3 * 80);
students[i][0] = malloc(80);
students[i][1] = malloc(80);
students[i][2] = malloc(80);
// Copy strings received into array
strcpy(students[i][0], schoolname);
strcpy(students[i][1], name);
strcpy(students[i][2], id);
// Resize students array for additional students
students = realloc(students, (size_t) (studentno+1) * 3*80);
i++;
}
// Check students are stored correctly
for(int i = 0; i < studentno-1; i++){
printf("%s - %s - %s\n", students[i][0], students[i][1], students[i][2]);
}
}