我有一个名为“图形”的文本文件,其中包含单词“脱氧核糖核酸”。
当我运行此代码时,它可以正常工作并返回第一个字符。 “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];
并将fscanf
和printf
中的参数分别改成这样:
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作为
fscanf或
fgets`中的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/