为什么char [1]从我的输入文件中读取整个单词?

qwa*_*was 0 c++ arrays file

这就是我到目前为止所做的:我想从C++中读取文件中的单词,并且我只允许使用cstring库.这是我的一段代码

#include <cstring>
#include <fstream>
#include <stdio.h>

using namespace std;

int main(){

    ifstream file;
    char word[1];


    file.open("p.txt");



    while (!file.eof()){

        file >> word;
        cout << word << endl;

    }
    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,一次只读一个字.但我不明白这是如何工作的.任何大小的char数组怎么可能是char字[1]或char字[50]一次只读一个字而忽略空格.

而且我想将这些单词存储在动态数组中.我怎样才能做到这一点?任何指导将不胜感激?

Vla*_*cow 7

您的代码具有未定义的行为.operator >>简单地覆盖数组之外的内存.

考虑到您所包含的标题<stdio.h>未在程序中使用.另一方面,您需要包含<cstdlib>声明函数的标头system.

至于你的第二个问题,你应该使用例如标准容器 std::vector<std::string>

例如

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstdlib>

int main()
{
    std::ifstream file("p.txt");
    std::string s;
    std::vector<std::string> v;
    v.reserve( 100 );



    while ( file >> s ) v.push_back( s );

    std::system( "pause" );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以简单地将矢量定义为

std::vector<std::string> v( ( std::istream_iterator<std::string>( file ) ),
                            std::istream_iterator<std::string>() );
Run Code Online (Sandbox Code Playgroud)

只要你包含标题 <iterator>

例如

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <cstdlib>

int main()
{
    std::ifstream file("p.txt");
    std::vector<std::string> v( ( std::istream_iterator<std::string>( file ) ),
                                std::istream_iterator<std::string>() );

    for ( const std::string &s : v ) std::cout << s << std::endl;

    std::system( "pause" );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)