C++ 字符串管理C/C++&;从txt文件读写

C++ 字符串管理C/C++&;从txt文件读写,c++,string,C++,String,我分别在文件中读取和写入字符串时遇到问题 目的: 要将字符串作为完整的句子输入到文本文件中,请从文本文件中读取字符串,并使用函数分隔以元音开头的所有单词,并将其显示为句子。(句子只需要由以元音开头的字符串中的单词组成。) 问题: 代码按预期工作,但由于我在从txt文件中提取子字符串时使用了getline()函数从txt文件中获取字符串,因此它在元音之后包含整个文件,而不仅仅是单词。我无法理解如何使子字符串只包含单词 代码: #包括 #包括 #包括 #包括 使用名称空间std; 字符串元音(字符串

我分别在文件中读取和写入字符串时遇到问题

目的: 要将字符串作为完整的句子输入到文本文件中,请从文本文件中读取字符串,并使用函数分隔以元音开头的所有单词,并将其显示为句子。(句子只需要由以元音开头的字符串中的单词组成。)

问题: 代码按预期工作,但由于我在从txt文件中提取子字符串时使用了getline()函数从txt文件中获取字符串,因此它在元音之后包含整个文件,而不仅仅是单词。我无法理解如何使子字符串只包含单词

代码:

#包括
#包括
#包括
#包括
使用名称空间std;
字符串元音(字符串a)
{
int c=尺寸f(a);
字符串b[c];
字符串d;
静态int n;

对于(int i=1;i我没有仔细阅读您的代码,但有几件事很突出:

  • 查找
    首先查找
    ——这将大大简化您的代码
  • sizeof(a)
    当然不会像你认为的那样做[除非你认为它给出了
    std::string
    类类型的大小-这使得它作为一个用例非常奇怪,为什么不使用12或24?]
  • find
    (和
    find\u first\u of
    ),从技术上讲,当函数找不到所需内容时,它不会返回-1。它返回
    std::string::npos
    [看起来可能是-1,但a)不能保证是,b)没有单音,所以不能是负数]
  • 您的程序只读取一行
  • x.substr(n)
    将从位置
    n
    向您提供
    x
    字符串-这就是您想要的吗
  • 不要重复
    find
    ,使用
    p=x.find(“x”);
    ,然后执行
    x.substr(p)
    [假设这是您想要的]

  • 我没有仔细阅读您的代码,但有几点很突出:

  • 查找
    首先查找
    ——这将大大简化您的代码
  • sizeof(a)
    当然不会像你认为的那样做[除非你认为它给出了
    std::string
    类类型的大小-这使得它作为一个用例非常奇怪,为什么不使用12或24?]
  • find
    (和
    find\u first\u of
    ),从技术上讲,当函数找不到所需内容时,它不会返回-1。它返回
    std::string::npos
    [看起来可能是-1,但a)不能保证是,b)没有单音,所以不能是负数]
  • 您的程序只读取一行
  • x.substr(n)
    将从位置
    n
    向您提供
    x
    字符串-这就是您想要的吗
  • 不要重复
    find
    ,使用
    p=x.find(“x”);
    ,然后执行
    x.substr(p)
    [假设这是您想要的]

  • 您的代码存在各种问题

    int c = sizeof( a );
    
    这是一个字符串在内存中占用的字节数。您当然不想创建一个包含这么多字符串的数组,因为这对您试图实现的目标毫无意义。不要这样做。您只需在循环中复制一个字符串,您只需要一个字符串,而您已经有了字符串d

    要获得字符串的实际大小,必须调用

    str.size()
    
    string.substr(..)有几个重载,其中一个重载只接受一个参数,即索引。这将返回原始字符串中从该索引开始的子字符串。(从元音开始的字符串一直到字符串末尾) 您可能正在寻找的是包含两个参数的重载,即开始索引(单词的开头和结尾)

    字符串输入不会使用您输入的换行符刷新cin。然后您以追加模式将其添加到文件中,因此在运行程序几次后,您的文件是一个巨大的单行程序。您真的打算这样做吗?
    也许你应该在输入后显式地在文件中添加新行。类似于file的东西,你的代码有各种各样的问题

    int c = sizeof( a );
    
    这是一个字符串在内存中占用的字节数。您当然不想创建一个包含这么多字符串的数组,因为这对您试图实现的目标毫无意义。不要这样做。您只需在循环中复制一个字符串,您只需要一个字符串,而您已经有了字符串d

    要获得字符串的实际大小,必须调用

    str.size()
    
    string.substr(..)有几个重载,其中一个重载只接受一个参数,即索引。这将返回原始字符串中从该索引开始的子字符串。(从元音开始的字符串一直到字符串末尾) 您可能正在寻找的是包含两个参数的重载,即开始索引(单词的开头和结尾)

    字符串输入不会使用您输入的换行符刷新cin。然后您以追加模式将其添加到文件中,因此在运行程序几次后,您的文件是一个巨大的单行程序。您真的打算这样做吗?
    也许你应该在输入输入后显式地在文件中添加新行。类似于file的东西我为未优化的代码感到抱歉…我仍然在学习C#…1的细节。我使用了sizeof(),因为我使用的是ios:app,字符串正在增加,所以我不确定要运行多少个循环,sizeof()我知道eof()和一个循环可以读取多行,我只是直接得到了1行的代码。3.是的,我希望它从左边继续,因此是“n”和“n+1”。4.我是x.substr()在一个单词后开始和结束;不包括字符串的整个剩余部分。但是
    sizeof
    并没有给出字符串中元素的数量,它给出了保存保持字符串的各种数据位所需的字节数
    b[i]=a.substr(a.find("a",n));
    
    static int n;