我在大学里已经学习了大约一年的编程,并且我已经学习了一些东西,所以我决定制作我自己的“主编”程序,它基本上编辑了你的windows hosts文件,允许您插入,删除和管理里面的URL。 :)
但是,尝试从文件中删除URL时遇到了问题。我实际上并没有删除它,因为我不知道该怎么做,但是我创建了一个新的空文本文件,然后复制除了我希望删除的URL之外的所有行。听起来很合理吗?
然而,似乎我不能删除网址而不留在所谓的“空行”内。至少不是我如何编码它...我已经尝试了一切,我真的需要你的帮助。
但请在这里使用“noob friendly”语言,我不会理解任何复杂的术语:)
谢谢,这是我的完整代码:
http://joggingbenefits.net/hcode.txt
这里只是我认为与我混淆的代码部分(删除URL功能):
void del(int lin) // line index
{
FILE* fp=fopen("C:\\Windows\\System32\\drivers\\etc\\hosts","r+");
FILE* fp1=fopen("C:\\Windows\\System32\\drivers\\etc\\hosts1","w");
char str[200];
int cnt=0;
while(! feof(fp))
{
fgets(str,200,fp);
if(str[0]=='#')
{
fputs(str,fp1);
}
else
{
if(cnt==lin)
{ // problem. FLAG?!
cnt++;
}
else
{
cnt++;
fputs(str,fp1);
}
}
}
fclose(fp);
fclose(fp1);
rename("C:\\Windows\\System32\\drivers\\etc\\hosts","C:\\Windows\\System32\\drivers\\etc\\deleteme");
rename("C:\\Windows\\System32\\drivers\\etc\\hosts1","C:\\Windows\\System32\\drivers\\etc\\hosts");
remove("C:\\Windows\\System32\\drivers\\etc\\deleteme");
cout << endl << "LINE DELETED!" << endl;
}
答案 0 :(得分:5)
由于您已将此标记为C ++,因此我假设您要重写它以消除C FILE
接口。
std::ifstream in_file("C:\\Windows\\System32\\drivers\\etc\\hosts");
std::ofstream out_file("C:\\Windows\\System32\\drivers\\etc\\hosts1");
std::string line;
while ( getline( in_file, line ) ) {
if ( ! line.empty() ) {
out_file << line << '\n';
}
}
非常简单!
答案 1 :(得分:0)
你还没有说 这个代码失败了(或者给我们一些文本作为例子),但我注意到你的循环有问题。 “文件结束”条件是由尝试读取文件末尾的行为引起的,但您在<{em> feof
之前进行了测试(fgets
),所以你在最后一行操作两次:控制在读取最后一行之后进入循环,尝试 - 并且失败 - 读取另一行,作用于仍在str
中的行,然后终止循环。
而不是
while(! feof(fp))
{
fgets(str,200,fp))
...
尝试:
while(fgets(str,200,fp))
{
...
答案 2 :(得分:0)
fgets()
函数读取行包括尾随行尾字符('\n'
),而puts()
函数写入行传递给和 end-of线条字符。所以如果你读了
this line
它存储为
this line\n
str
中的。并以
的形式写回文件 this line\n\n
看起来像这样
this line
在文件中。
fprintf(fp2, "%s", str);
"\n"
之前删除str
中的尾随fputs()
。