.size()字符串操作不读取字符c ++的实际长度/大小

时间:2017-04-28 07:16:28

标签: c++ string iostream file-handling

我试图从文件中读取一篇文章,然后我需要将句子的每个开头字母改为大写字母,然后将修正后的文章发送回一个名为correct.txt的文件。论文存储在essay.txt中。

到目前为止,我只是在理解从文件到字符串的转换,以便我继续处理剩下的问题。到目前为止,我有一个字符串变量,其中包含由单个空格分隔的单词。我注意到当我尝试使用我的新字符串的大小时,它没有给我正确的答案,我无法弄清楚为什么。如果您对我如何能够注意到正确数量的字符有任何建议,我将非常感激。

当你在这里时还有一个问题,我知道前进,为了将句子的开头字母改为大写,我需要先找到句号。一旦我有了这个位置,我就可以使用pos + 2(包括句点之后的前面的空格)来表示需要变成大写的字符。这是解决这个问题的正确方法吗?你有什么其他的提示可以解决这个问题吗?

到目前为止,这是我的代码:

    #include "stdafx.h"
    #include <iostream>
    #include <fstream> 
    #include <string>
    #include <cstdlib>
    using namespace std;

    int main(){

      //declaring variables and creating objects
      ifstream inputFile;
      ofstream outputFile;
      char inputFileName[20], outFileName[20];

       cout << "Enter name of the file you want to open: " << endl;
       cin >> inputFileName;

       inputFile.open(inputFileName);
       if (inputFile.fail()) {

         cout << "Input file opening failed.\n";
         exit(1);
      }

       cout << "Enter name of the file you want to send the output to: " << endl;
       cin >> outFileName;

       outputFile.open(outFileName);
       if (outputFile.fail()) {

         cout << "Output file opening failed.\n";
         exit(1);
    }

     //while the file is open, it sends the contents to the string variable "essay"
     string essay;
     inputFile >> essay;

     while (!inputFile.eof()) {

       cout << essay << " "; 
       inputFile >> essay;

     }

     //this is to check for the correct size of the string "essay" before moving on to the rest of the code
     int size = essay.size();
     cout << size << endl;

     return 0;
    }

2 个答案:

答案 0 :(得分:0)

您对输入流如何工作的理解不正确。

代码的核心就是这个循环:

string essay;
inputFile >> essay;
while (!inputFile.eof()) {
  cout << essay << " "; 
  inputFile >> essay;
}

这样做是因为它将第一个单词读入essay,然后,只要未在流上设置eof标记,它就会回显刚读取的单词,然后读取另一个单词,覆盖前一个

这是正确的代码。请注意,在循环条件下检查eof是一个坏主意,因为它并不能完全按照您的意愿行事,如果流输入了错误条件,也会陷入无限循环。

string word;
while (inputFile >> word) { // read a word and stop if this fails for any reason
  essay += word;
  essay += " ";
}

虽然我不确定你为什么一个字一个字地读取文件而不是一次性读取文件。

另外,我觉得有必要重复M.M.在评论中说:你在输入上使用原始字符数组是不安全不必要。只需使用string即可。然后你需要编写inputFile.open(inputFileName.c_str()),除非你的标准库足够新以使这些函数有string重载,但这很好。另一种做法是危险的,也是一种非常糟糕的习惯。

答案 1 :(得分:-1)

尝试在字符串顶部包含cstring。 String被认为是char数组,这是一种更“独特”的数据存储方式。您可以尝试下面列出的代码。

int size = essay.length();