无法用c ++打印文本文件

时间:2017-01-13 22:22:03

标签: c++ visual-studio visual-studio-2013

嘿伙计们,所以我一直试图让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

1 个答案:

答案 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

再一次,您提供wordscanf()会发生什么,因此您提供word[]数组中第一个字符的地址,并scanf()存储此处的输入以下单元格,可能会溢出缓冲区。 (关于缓冲区溢出也是如此,而我们对它来说,它是一个重要的问题)

当您打印信息时,您不需要地址来存储,而是将值转换为人类可读的形式。但是,如果字符串仍然提供第一个字符的地址,那么它看起来几乎相同。