我试图将文件中的每个字符(用于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;
}
这是一种有效的方法:
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
过敏,请用循环替换呼叫以转换字符。