我尝试将文件中的每个字符都用到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;
}
答案 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
过敏,请使用循环替换呼叫以转换字符。