我有一个名为“ graphics”的文本文件,其中包含单词“ deoxyribonucleic acid”。
当我运行此代码时,它可以工作并且返回第一个字符。“ 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
?
现在,我想让程序读取文件并获取第一个单词并将其存储在名称中。我知道这必须是一个字符串(一个字符数组)。所以我要做的是:我将名称命名为可以存储20个元素的字符数组。
char name[20];
并分别在fscanf
和中更改参数printf
:
fscanf( fileptr, "%s", name);
printf("%s\n", name);
这样做不会从编译器产生任何错误,但是程序会崩溃,我也不知道为什么。我让fscanf
我想让它读取一个字符串,也让我printf
知道它会输出一个字符串。我哪里做错了?我将如何完成上述任务?
这是一个非常普遍的问题。fscanf
读取数据并将其复制到您提供的位置;所以首先,您需要使用,&
因为您提供了变量的地址(而不是值)-这样就fscanf
知道了将TO复制到何处。
但是,您真的想使用复制“仅与我有空格的字符数”一样的函数。例如fgets()
,这包括一个“最大字节数”参数:
char * fgets ( char * str, int num, FILE * stream );
现在,如果您知道只为分配了20个字节str
,则可以防止读取超过20个字节并覆盖其他内存。
非常重要的概念!
其他几点。像这样的变量声明
char myString[20];
结果myString
是一个指向20个字节的内存,你可以把一个字符串(记得留出空间终止“\ 0”!). So you can use
的myStringas the
的char *argument in
的fscanf or
fgets`。但是,当你尝试读取单个字符,而字符被宣布如
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
(正确转换的参数数量)。您期望精确地转换一个。如果那不起作用,它将打印消息(显然,您将要做的不仅仅是打印消息……)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句