1

我在使用这个程序时遇到了一些问题,我不知道我做错了什么;该程序仍然不允许显示文件,它仍然不会大写字母“a”。该程序应该从外部文件 input.txt 中读取,将所有以字母“a”开头的单词大写,然后将它们写入外部文件 output.txt。任何帮助将不胜感激!谢谢!

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

void nm(string nm, ifstream& xfile);
void mov(ifstream& xfile, string& valfile);
void exam(string& valfile);
void display(string nm, ofstream& yfile, string& valfile);

int main()
{
    ifstream xfile;
    ofstream yfile;
    string valfile;
    nm("input.txt", xfile);
    mov(xfile, valfile);
    exam(valfile);
    display("output.txt", yfile, valfile);
}

void nm(string nm, ifstream& xfile)
{
   xfile.open(nm);
   if (xfile.fail())
   {
       cerr << "Unable to open file \"" << nm << "\" for reading.\n";
       exit(1);
   }
}

void mov(ifstream& xcode, string& valfile)
{
    while (xcode.good())
    {
        valfile += xcode.get();
    }
    xcode.close();
    cout << endl << '[' << valfile[valfile.length()-1] << ']' << endl;
    valfile = valfile.substr( 0, valfile.length()-1 );
}

void exam(string& valfile)
{
    for(int i = 1; i < valfile.length(); i++)
    {
        if(  valfile[i] == 'a' && isspace((int) valfile[i-1]) &&
           ( isspace((int) valfile[i+1]) || isalpha((int) valfile[i+1]) )  )
        {
            valfile[i] = 'A';
        }
    }
}

 void display(string nm, ofstream& yfile, string& valfile)
 {
    yfile.open(nm);
    yfile << valfile;
    yfile.close();
}
4

4 回答 4

2

为了编译您的代码(在 gcc 编译器上),我必须进行以下修改:

  1. #include <cstdlib>exit要定义的功能添加

  2. 换行:

    xfile.open(nm);xfile.open(nm.c_str()); yfile.open(nm);yfile.open(nm.c_str());

    因为 nm 是一个字符串,而 ifstream/ofstream.open 采用普通的旧字符数组。要将字符串转换为 char 数组,请使用somestring.c_str()函数。

  3. 此表达式valfile[valfile.length()-1]将返回您 valfile 字符串中的最后一个字符...例如,如果文件不为空,则 valfile[0] 将只返回文件中的一个(第一个)字符。要更正它,只需打印出来valfile

    cout << endl << '[' << valfile << ']' << endl;
    
  4. 将此丑陋的 hack 添加到您的考试功能中,以a在文件开头大写可能的字符:

    void exam(string& valfile)
    {
        if( (valfile.length()>=1) && (valfile[0]=='a')) valfile[0]='A';
        ...
    
于 2013-07-26T17:52:10.320 回答
1

传递char*ifstream构造函数,使用c_str()函数。

display()

yfile.open(nm.c_str());

nm()

xfile.open(nm.c_str());

添加#include <cstdlib>退出

刚刚有了另一个想法:

#include <fstream>
#include <string>
#include<algorithm>
#include<iterator>
#include <sstream>

using namespace std;

int main()

{
    vector <string> v;

    ifstream ip("input.txt");
    ofstream op("output.txt");

    string str;

    while (getline(ip, str))
            v.push_back(str);

    transform(v.begin(),
        v.end(),
        ostream_iterator<string>(op,"\n"),
        [](const string& x){
        stringstream iss(x);
        vector <string> words;
        string s;
        //Split words
        copy(istream_iterator<string>(iss),
                 istream_iterator<string>(),
                 back_inserter(words));
        for(auto& it:words)
            if(it[0]=='a')
                it[0]='A';
        s=words[0];
        for(auto it=1;it<words.size();++it)
            s+=" "+words[it]; //Join words
        return s;
        }
        );

    ip.close();
    op.close();
}
//g++ -o test test.cpp -std=c++0x
于 2013-07-26T17:52:13.693 回答
1

您可能想从零开始迭代,您正在跳过第一个字符。

void exam(string& valfile)
{
    for(int i = 0; i < valfile.length(); i++)
    {
        if(  valfile[i] == 'a' && isspace((int) valfile[i-1]) &&
           ( isspace((int) valfile[i+1]) || isalpha((int) valfile[i+1]) )  )
        {
            valfile[i] = 'A';
        }
    }
}
于 2013-07-26T17:55:37.617 回答
1

首先纠正“考试”功能。现在编写循环的方式将访问字符串末尾的字符。

我将主要内容更改为:

int main()
{
    std::string s("a a a a a");

    std::cout << "before=[" << s << ']' << std::endl;
    exam(s);
    std::cout << " after=[" << s << ']' << std::endl;

    return 0;
}

并得到:

$ ./a.exe 
before=[a a a a a]
 after=[a A A A a]

这是你想要的吗?

于 2013-07-26T18:13:15.250 回答