9 个解决方案
#1
没人回答,那自己顶了。
#2
在C下干过,不知道对你有没有用
一:把所有文件读出来,改特定地方
二:跳文件指针,就能修改到特定地方
一:把所有文件读出来,改特定地方
二:跳文件指针,就能修改到特定地方
#3
谢谢 lbing7(楼主,别再给我非专家分!谢谢合作)
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100
我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100
我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?
#4
fstream 派生自 basic_fstream,后者又派生自basic_iostream,后者又派生自 basic_ostream。
而basic_ostream提供了:
basic_ostream& seekp(pos_type pos);
basic_ostream& seekp(off_type off, ios_base::seek_dir way);
两个函数,可以用来在文件中定位:-)
附测试代码:
--- fs.cpp ---
#include <fstream>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::fstream;
using std::string;
int main(int argc, char **argv)
{
if (argc != 2)
{
cout << "Usage: fs <filename>" << endl;
return -1;
}
fstream fs;
fs.open(argv[1]);
fs.seekp(10);
string s("happy!");
fs << s;
return 0;
}
------------------------
编译出fs.exe
然后用fs test.txt可以测试结果
test.txt原本内容为
abcdefghijklmn12345
执行完毕之后为
abcdefghijhappy!345
PS.
csdn的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)
而basic_ostream提供了:
basic_ostream& seekp(pos_type pos);
basic_ostream& seekp(off_type off, ios_base::seek_dir way);
两个函数,可以用来在文件中定位:-)
附测试代码:
--- fs.cpp ---
#include <fstream>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::fstream;
using std::string;
int main(int argc, char **argv)
{
if (argc != 2)
{
cout << "Usage: fs <filename>" << endl;
return -1;
}
fstream fs;
fs.open(argv[1]);
fs.seekp(10);
string s("happy!");
fs << s;
return 0;
}
------------------------
编译出fs.exe
然后用fs test.txt可以测试结果
test.txt原本内容为
abcdefghijklmn12345
执行完毕之后为
abcdefghijhappy!345
PS.
csdn的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)
#5
好贴,收藏了
#6
楼上的楼上的你忘了关闭文件了,呵呵
#7
细心:-)
不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)
不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)
#8
谢谢大家,不过我又碰到一个问题:
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?
#9
OK,小弟解决问题了,原来用tellg()函数就可以了。
多谢大家了!
多谢大家了!
#1
没人回答,那自己顶了。
#2
在C下干过,不知道对你有没有用
一:把所有文件读出来,改特定地方
二:跳文件指针,就能修改到特定地方
一:把所有文件读出来,改特定地方
二:跳文件指针,就能修改到特定地方
#3
谢谢 lbing7(楼主,别再给我非专家分!谢谢合作)
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100
我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?
但我还是不太理解,我的意思是,比如文件中有一行内容为:
number=100
我想把=右边的100改成200,但不想把文件全部重新写一遍,可以实现吗?
#4
fstream 派生自 basic_fstream,后者又派生自basic_iostream,后者又派生自 basic_ostream。
而basic_ostream提供了:
basic_ostream& seekp(pos_type pos);
basic_ostream& seekp(off_type off, ios_base::seek_dir way);
两个函数,可以用来在文件中定位:-)
附测试代码:
--- fs.cpp ---
#include <fstream>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::fstream;
using std::string;
int main(int argc, char **argv)
{
if (argc != 2)
{
cout << "Usage: fs <filename>" << endl;
return -1;
}
fstream fs;
fs.open(argv[1]);
fs.seekp(10);
string s("happy!");
fs << s;
return 0;
}
------------------------
编译出fs.exe
然后用fs test.txt可以测试结果
test.txt原本内容为
abcdefghijklmn12345
执行完毕之后为
abcdefghijhappy!345
PS.
csdn的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)
而basic_ostream提供了:
basic_ostream& seekp(pos_type pos);
basic_ostream& seekp(off_type off, ios_base::seek_dir way);
两个函数,可以用来在文件中定位:-)
附测试代码:
--- fs.cpp ---
#include <fstream>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::fstream;
using std::string;
int main(int argc, char **argv)
{
if (argc != 2)
{
cout << "Usage: fs <filename>" << endl;
return -1;
}
fstream fs;
fs.open(argv[1]);
fs.seekp(10);
string s("happy!");
fs << s;
return 0;
}
------------------------
编译出fs.exe
然后用fs test.txt可以测试结果
test.txt原本内容为
abcdefghijklmn12345
执行完毕之后为
abcdefghijhappy!345
PS.
csdn的论坛会自动去掉每行前面的空格,所以上面的代码,每行前面的空格我用的是全角字符。直接拷贝下来需要把每行前面的全角空格去掉才可以编译:-)
#5
好贴,收藏了
#6
楼上的楼上的你忘了关闭文件了,呵呵
#7
细心:-)
不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)
不过显式的调用关闭函数并非必须,在fstream里面有一个filebuf类型的对象,它在析构的时候会关闭文件的:-)
#8
谢谢大家,不过我又碰到一个问题:
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?
当多次调用getline()后,定位到某一行,要修改这一行中的某位置,除了用seekp()外,还需要什么函数吗?
#9
OK,小弟解决问题了,原来用tellg()函数就可以了。
多谢大家了!
多谢大家了!