【问题标题】:Can getline() be used to get a char array from a fstream可以使用 getline() 从 fstream 中获取 char 数组吗
【发布时间】:2010-12-31 05:00:08
【问题描述】:

我想在已经使用 char 数组处理字符串的程序中添加一个新的 (fstream) 函数。 问题是下面的代码会产生字符串,而我能想到的唯一方法是使用一个中间函数,将字符串逐个字符地复制到一个新的字符数组中,然后将它们传递给程序中的函数,取回结果,然后逐个字符地将结果复制回字符串中。

肯定(希望)一定有更好的方法吗?

谢谢!

void translateStream(ifstream &input, ostream& cout) {   
  string inputStr;
  string translated;

  getline(input, inputStr, ' ');

  while (!input.eof()) {
    translateWord(inputStr, translated);
    cout << translated;
    getline(input, inputStr, ' ');
  }

    cout << inputStr;

translateWord 函数:

void translateWord(char orig[], char pig[]) {
  bool dropCap = false;
  int len = strlen(orig)-1;
  int firstVowel = findFirstVowel(orig);
  char tempStr[len];

  strcpy(pig, orig);


  if (isdigit(orig[0])) return;


  //remember if dropped cap
  if (isupper(orig[0])) dropCap = true;        

  if (firstVowel == -1) {
    strcat(pig, "ay");
    //    return;
  }

  if (isVowel(orig[0], 0, len)) {
    strcat(pig, "way");
    //    return;
  } else {

    splitString(pig,tempStr,firstVowel);

    strcat(tempStr, pig);
    strcat(tempStr, "ay");

    strcpy(pig,tempStr);
  }


  if (dropCap) {
    pig[0] = toupper(pig[0]);
  }

}

【问题讨论】:

  • 了解 translateword() 的作用会有所帮助 - 请至少发布声明。
  • 现在添加了 Neil -(它翻译成猪拉丁语)
  • 那肯定会以某种非常可怕的方式失败!

标签: c++ string iostream


【解决方案1】:

您可以将字符串作为第一个参数传递给 translateWord,方法是将第一个参数设为 const char *。然后你以inputStr.c_str() 作为第一个参数调用该函数。不过,请处理第二个(输出)参数,您需要完全重写 translateWord 以使用 std::string (最好的解决方案,恕我直言),或者传递适当大小的 char 数组作为第二个参数。

另外,您发布的内容实际上并不是 C++ - 例如:

char tempStr[len];

C++ 不支持 - 它是 g++ 的扩展,取自 C99。

【讨论】:

    【解决方案2】:

    您可以使用成员函数ifstream::getline。它将char* 缓冲区作为第一个参数,将大小参数作为第二个参数。

    【讨论】:

    • 不确定我是否遵循,我已经在使用 getline,虽然这似乎在输出一个字符串?
    • 有两个getline函数。
    • Bhatia,建议您应该使用 不同的 getline 函数。流对象有自己的填充字符数组的 getline 方法。使用它而不是字符串标头中的独立 getline 函数。 直接解决了您提出的问题,而 Neil 的回答解决了您程序的根本问题——如果您发现自己需要转换为数组然后再转换回字符串,那么也许您应该使用专门的字符串,因此您可以跳过所有转换。
    • 我明白你们的意思,我认为设计在某些方面存在根本性缺陷 - 我能够让 Neil 的解决方案发挥作用,但我认为这些指针可能会让事情变得更容易,我想我也会试一试的。谢谢大家指出!
    • 我不确定这是否是一项家庭作业,(尽管我倾向于认为它具有将字符串翻译成猪拉丁语的一般用途),但除非你有某种强加的强制您在此处使用 C 字符串的约束,您只需使用 std::string 就可以让您的生活更轻松。正如 Neil 上面指出的那样,这将显着简化和改进您的 translateWord 功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2023-04-07
    • 2018-11-14
    相关资源
    最近更新 更多