Aqu*_*irl 0 c++ file-io ifstream
void maintainFileName ()
{
std :: ifstream myfile;
myfile.open ("zoomLevels.txt");
if (myfile.is_open ())
{
// Move to end of the file,
myfile.seekg (0, std::ios::end);
// and then six characters back to pick up the last file number.
myfile.seekg (6, std::ios::beg);
int len = 1;
char *t = new char[len];
myfile.read(t, len);
qDebug () << "\nt: " << *t << "\n";
}
else
{
qDebug () << "\nsorry";
}
}
Run Code Online (Sandbox Code Playgroud)
该文件包含:
78.8115,29.582,1,01.rda
78.8115,29.582,2,02.rda
76.3671,30.2201,1,11.rda
76.3671,30.2201,2,12.rda
78.1908,30.3007,1,01.rda
78.1908,30.3007,2,02.rda
77.3284,29.1415,1,01.rda
77.3284,29.1415,2,02.rda
77.3064,29.1655,1,01.rda
77.3064,29.1655,2,02.rda
Run Code Online (Sandbox Code Playgroud)
该函数返回的值是5,而结尾的第六个字符是0!
我哪里错了?
寻找文本文件中的任意位置是未定义的行为.在实践中,它可能会在各种Unices下工作,但在其他任何地方都没有.如果以二进制模式打开文件,则搜索是合法的.形式上,如果以二进制模式打开文件,最后可能会得到额外的nul字节,但实际上,这在今天不是问题.但是,如果以二进制模式打开它,您可能会看到其他内容而不是
'\n'数据; 例如,在Windows下,您将看到两个字符序列0x0D, 0x0A.
当然,在您的代码中,您从一开始就寻求,而不是从最终开始.这也是未定义的行为,但大多数情况下,只要您在第一行搜索,它就会起作用.
最后,你所展示的数据中最后的第六个字符是a
'2',而不是a '0',就像你写的那样.但是,当然,在Unix以外的系统上,您可以轻松地看到其他内容(或者出现错误):可能是
'.'Windows下,或者' '某个大型机操作系统下的错误(或者可能是' ).
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |