c - C中从文件中读取字符串输入

标签 c string compiler-construction scanf

我有一个名为“图形”的文本文件,其中包含单词“脱氧核糖核酸”。

当我运行此代码时,它可以正常工作并返回第一个字符。 “d”

int main(){

    FILE *fileptr;                          
    fileptr = fopen("graphics.txt", "r");   
    char name;

    if(fileptr != NULL){ printf("hey \n"); }
    else{ printf("Error"); }

    fscanf( fileptr, "%c", &name);
    printf("%c\n", name);
    fclose( fileptr );

    return 0;
}

当我使用 fscanf 函数时,我发送的参数是 FILE 对象的名称、函数将读取的数据类型以及它将要存储的对象的名称说的数据对吗?另外,为什么我必须在 fscanf 中的名称前面加上 & 而不是在 printf 中?

现在,我想让程序读取文件并获取第一个单词并将其存储在名称中。 我知道这必须是一个字符串(一个字符数组)。 所以我所做的是: 我把name做成了一个可以存储20个元素的字符数组。

char name[20];

并将fscanfprintf中的参数分别改成这样:

fscanf( fileptr, "%s", name);
printf("%s\n", name);

这样做不会产生编译器错误,但程序会崩溃,我不明白为什么。我让 fscanf 知道我想要它读取一个字符串,我也让 printf 知道它将输出一个字符串。我哪里做错了?我将如何完成上述任务?

最佳答案

这是一个很常见的问题。 fscanf 读取数据并将其复制到您提供的位置;所以首先,你需要 & 因为你提供了变量的 address (不是值) - 这样 fscanf 知道在哪里复制到。

但您确实希望使用“只复制尽可能多的字符”的函数。这是例如 fgets() ,其中包括一个“最大字节数”参数:

char * fgets ( char * str, int num, FILE * stream );

现在,如果您知道您只为 str 分配了 20 个字节,就可以防止读取超过 20 个字节并覆盖其他内存。

非常重要的概念!

其他几点。像这样的变量声明

char myString[20];

导致 myString 成为指向 20 字节内存的指针,您可以在其中放置字符串(请记住为终止的 '\0' 留出空间!)。因此,您可以使用myString作为fscanffgets`中的char *参数。但是当您尝试读取单个字符时,该字符被声明为

char myChar;

您必须“手动”创建指向内存位置的指针,这就是您以 &myChar 结尾的原因。

注意 - 如果您想读取空白,fscanf 是更好的函数;但如果您不确定分配的空间量是否正确,这将是一个问题。正如评论中所建议的那样,您可以执行以下操作:

char myBuffer[20];
int count = fscanf(fileptr, "%19s ", myBuffer);
if(count != 1) {
  printf("failed to read a string - maybe the name is too long?\n");
}

这里您使用的是 fscanf 的返回值(正确转换的参数数量)。您期望转换为一个;如果这不起作用,它将打印消息(显然您想要做的不仅仅是打印一条消息……)

关于c - C中从文件中读取字符串输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754792/

相关文章:

c - 有没有不是C++的 "C with classes"语言?

c - 为什么 math.h 不定义倒数三角函数?

javascript - 循环遍历字符串

string - 如何从 URL 中提取域

linux - 为 SPARC、IBM power CPU 开发应用程序是否需要单独的编译器,而不是 x86、x86-64 目标?

c - printk : too many arguments for format 的 Linux 内核模块错误

c - 将文件读入 2d 字符数组适用于 500 行,但不适用于 50,000 行

swift - 我不能在正则表达式中包含 ' 符号

compiler-construction - 建立一个链接器

java - 任何适用于 Java 的 L(AL)R 语法