如何将所有fstream文件内容转换为大写或小写?

时间:2018-03-26 19:48:56

标签: c++

我尝试将文件中的每个字符都用到toupper()tolower()函数中。但我不能把结果放在角色上。

我用vector来解决它。

有一种简单的方法可以解决这个问题吗?

void UpperCase(){
    fstream file;
    char name[81] , ch;
    vector<char> container;
    cout << "Enter the file name : ";
    cin >> name;
    file.open(name,ios::in);
    while(!file.eof() && !file.fail()){
        file.get(ch);
        container.push_back(toupper(ch));
    }
    file.close();
    file.open(name,ios::out);
    for(int i=0 ; i<container.size()-1 ; ++i){
        file.put(container[i]);
    }
    file.close();
    return;
}

1 个答案:

答案 0 :(得分:2)

这是一种有效的方法:

char buffer[4096];
std::string name;
std::cout << "Enter filename: ";
std::cin >> name;
std::ifstream input(name.c_str(), ios::binary);
const std::string out_filename = name + ".upper_case";
std::ofstream output(out_filename.c_str(), ios::binary);
while (input.read(buffer, sizeof(buffer))
{
  const unsigned int chars_read = input.gcount();
  std::transform(&buffer[0], &buffer[chars_read],
                 &buffer[0], toupper);
  output.write(buffer, chars_read);
}

上面的代码读入一个字符块,然后将它们转换为大写,然后将块写入另一个文件。

写入另一个文件是一种安全的做法,您无需将整个文件读入内存。

您可以更改缓冲区的大小以提高程序的效率。建议大小是512的倍数,因为这是硬盘驱动器行业的标准尺寸。

编辑1:
如果您对std::transform过敏,请使用循环替换呼叫以转换字符。