student.dat file
----------------
Stu:1 abc ($) - 55 in following order (Stu: %d %s (%c) - %d)
Stu:2 pqr (^) - 82
我正在尝试读取此文件,并将最高年级的详细信息保存在c编程中的变量中。我的代码在下面,但不完整!
int main(){
int num, grade;
char id, name[35];
FILE *fp = NULL;
fp = fopen("student.dat", "r");
if (fp != NULL) {
while ((fp != '\n') && (fp != EOF)) {
fscanf(fp, "%d %s %c %d", &num, name, id, &grade);
printf("Student Num: %d", num);
printf("Student Name: %s", name);
printf("Student id: %c", id);
printf("Student grade: %d", grade);
}
fclose(fp);
}else {
printf("Failed to open file\n");
}
}
在C语言中,您有2种主要方式来读取面向行的输入,然后解析为单个值(确实为3,但是现在我们将忽略沿字符串向下移动一对指针)。
首选方式是使用面向行的输入函数(例如fgets
或POSIX)getline
将整行读取到缓冲区中,然后解析缓冲区,sscanf
通过该缓冲区可以比对的单次调用更灵活地完成此操作fscanf
。
但是,您似乎专用于fscanf
此处。fscanf
成功使用的关键是提供一个格式字符串,该格式字符串说明要读取的行中的所有字符,或者制作格式字符串以利用各个格式说明符的属性来完成同一件事(例如%s
(以及您的数值转换)将跳过前导空格,使您可以控制一些行尾,否则行尾将留在输入缓冲区中(文件或stdin
,因此是后续调用时可用的下一个字符fscanf
,如果调用不正确)处理后,将扳手插入您的阅读例程中。
另一个强制性步骤是验证在每次读取过程中指定的所有转换均已成功完成。您可以通过检查匹配计数的return
值(已成功转换的次数的计数)来做到fscanf
这一点。如果不进行检查,您将无法确信您的值实际上保存了您认为它们包含的数据。
将它们放在一起,使用输入文件,并以打开的文件名作为程序的第一个参数(stdin
如果没有给出文件名,则默认读取),您可以执行以下操作:
#include <stdio.h>
int main (int argc, char **argv) {
int num =0, grade = 0, max = 0; /* initialize all variables */
char id = 0, name[35];
const char *fmt = " Stu:%d %s (%c) - %d"; /* given format string */
FILE *fp = NULL;
if (!(fp = argc > 1 ? fopen (argv[1], "r") : stdin)) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
/* read each line and validate 4 successful conversions */
while (fscanf (fp, fmt, &num, name, &id, &grade) == 4) {
if (grade > max) max = grade;
printf ("Student Num: %d Name: %-12s id: %c grade: %d\n",
num, name, id, grade);
}
printf ("\n highest grade : %d\n\n", max);
if (fp != stdin) fclose (fp);
return 0;
}
使用/输出示例
$ ./bin/stdntread <dat/stdntread.dat
Student Num: 1 Name: abc id: $ grade: 55
Student Num: 2 Name: pqr id: ^ grade: 82
highest grade : 82
查看代码,尤其是对格式说明符的细微调整,如果您还有其他问题,请与我联系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句