为什么在C中,在读取文件时,我们是否必须使用字符数组?

时间:2016-09-21 23:26:32

标签: c arrays string file io

我实际上刚开始用C语言编程。来自对Python的一点了解。

刚做过关于C的讲座,讲座是关于这个:

#include <stdio.h>

int main() {
    FILE *file;
    char name[10], degree[5];
    int mark;
    file = fopen("file.txt", "r");
    while (fscan(file("%s %s %d", name, degree, &mark) != EOF);
        printf("%s %s %d", name, degree, mark);
    fclose(file);
}

我特别问为什么讲师会使用数组而不只是声明两个字符串变量。正在寻找更深层次的答案,“那只是你的C”。

3 个答案:

答案 0 :(得分:3)

此行有多个拼写错误:

while (fscan(file("%s %s %d", name, degree, &mark) != EOF);
    printf("%s %s %d", name, degree, mark);

应该是:

while (fscanf(file, "%s %s %d", name, degree, &mark) == 3)
    printf("%s %s %d", name, degree, mark);

你能发现4个错误吗?

  • 该函数名为fscanf
  • file后面是,的参数,而不是(后面的函数名称
  • 只要fscanf转换3个值,就应该保持循环。如果转换失败,例如因为第三个字段不是数字,它将返回一个简短计数,不一定是EOF
  • 您在条件之后输入了额外的;。这被解析为一个空语句:循环继续读取直到文件结束,什么都不做,最后只执行printf一次,可能有无效的参数。

程序员使用char数组并将其地址传递给fscanf。如果他使用了指针(char *),他就需要分配内存以使它们指向某个东西并将其传递给fscanf,这是一种不同的方法固定数组大小所需。

请注意,代码应通过指定要存储到数组中的最大字符数来防止潜在的缓冲区溢出:

while (fscanf(file, "%9s %4s %d", name, degree, &mark) == 3) {
    printf("%s %s %d", name, degree, mark);
}

另请注意,这些硬编码的数字必须与数组大小减1相匹配,没有直接的方法将数组大小传递给fscanf(),这是修改代码时常见的错误来源。这个功能有许多怪癖和缺点,使用非常谨慎。

答案 1 :(得分:1)

name[]为例。它是char s的数组,如果您愿意,可以是char的集合。

中没有字符串类型,因此当我们想要使用字符串时,我们使用数组char s。

代码是这样写的,这样我们就可以在我们的数组中读取文件行中的实际字符串。

作为旁注,该程序将产生语法错误。

答案 2 :(得分:0)

每个非空文件中包含的是一系列字节。因此,您的C程序必须执行的操作是读取 bytes 。由于变量类型char用于表示一个字节,并且由于您希望一次读取多个字节以提高效率,因此您将读取一个字符数组。这对于从文件中读取的一般理解意味着什么。

回到你的例子,C中没有 string 类型。字符串是由nul字符结尾的字节数组(char[])。 讲师正在做的是:

  1. 定义一个字符数组(包含一个字符串)=&gt; char name[10]是一个数组,可能包含最多9个字符的字符串(最后一个字节将用于'\0')。
  2. 要求fscanf读取字符串,这意味着它将读取多个字节(多个char s),直到找到一个空字符('\0')并将所有这些放在给定的数组中。
  3. 要了解发生了什么,请忘记将字符串作为不透明的数据类型(在其他编程语言中可能是这样),并将它们视为它们的真实含义:字符数组。