嘿伙计们,所以我一直试图让c ++在visual studio pro 2013中打印文本文件。到目前为止,这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char word[30];
FILE *fp;
if ((fp = fopen("Text.txt", "r")) == NULL)
{
printf("File could not be opened\n");
}
else
{
fscanf(fp, "%s", word);
while (!feof(fp))
{
fscanf(fp, "%s", word);
}
fclose(fp);
}
system("PAUSE");
return 0;
}
Text.txt是我在visual studio中制作的文本文件,存储在源文件下。目前所发生的一切都是窗口打印暂停消息...有关如何解决它的任何建议?抱歉,这是一个noob问题:p
答案 0 :(得分:2)
您没有使用任何其他功能可以在屏幕上打印任何内容。
scanf()
是一个读取并在某种程度上解释标准输入(通常是用户输入)的函数。
等效打印功能为printf()
。
scanf()
和printf()
函数都是通过格式化字符串控制的,它告诉他们如何解释要输出的数据,或者如何解释应该存储在变量中的标准输入。 / p>
格式化字符串以ac字符串形式提供,即一个以空字符结尾的字符串,即一个字符数组,最后一个字符为NUL
(\0
实体; '\0'
字符) 。在该字符串中,您可以提供有关要读取或写入的数据的类型和顺序的信息。铁。 %s
表示字符串。正确的字符串可以包含除NUL
之外的所有值的字节,这被视为终止字符。但是对于输入,空格被认为是字符串的结尾,因此scanf()
将在遇到空格时停止读取。
当您阅读数据时,您必须提供带地址的功能,并在那里存储值。如果是字符串,字符串在C中的工作方式,则将值从指针传递给字符。指向字符的指针存储一个值,该值是内存中的地址。该地址可以是单个字符,但也可以是数组中第一个字符的地址,其中连续字符存储在后续存储单元中。但是,为了存储该字符数组而分配的存储器数量(从存储在该指针中的地址开始)的信息不会自动保存。事实上,它可能确实是一个单个字符,因此如果你打算将它用作字符串,它最多可以存储0个重要字符+空终止字符。
在您的情况下,word[]
是一个数组,word
评估word[0]
在内存中的位置。整个数组包含30个字符,因此您最多可以存储29个有效字符+ null。但是scanf()
并不保证它会以第29个字符停止,就像你使用它一样。也许您应该查阅scanf()
的一些参考页面,并了解有关格式化字符串的更多信息,我依稀记得,也许您可以通过适当的格式化字符串以某种方式限制您的阅读。也许像%29s
。
再一次,您提供word
到scanf()
会发生什么,因此您提供word[]
数组中第一个字符的地址,并scanf()
存储此处的输入以下单元格,可能会溢出缓冲区。 (关于缓冲区溢出也是如此,而我们对它来说,它是一个重要的问题)
当您打印信息时,您不需要地址来存储,而是将值转换为人类可读的形式。但是,如果字符串仍然提供第一个字符的地址,那么它看起来几乎相同。