在 Sublime 和 Vim 在 EOF 中发现奇怪的行为
Strange behavior found in Sublime and Vim at EOF
我有一个名为 position.txt
的文件,该文件已以特定方式格式化。这是position.txt的内容:
START POLYMER 1
1 0 0
2 0 0
3 0 0
4 0 0
4 1 0
5 1 0
5 0 0
6 0 0
END POLYMER 1
然而,当我使用 vi 查看 position.txt
时,我看到了这个:
当我在 sublime 中查看 positions.txt
时,我看到:
很明显,Sublime 中似乎多了一行,在 Vi 中不可见。这应该不是问题,但我是运行下面的代码:
int Grid::ExtractNumberOfPolymers(std::string filename){
std::regex start("START");
std::regex end ("END");
std::ifstream myfile (filename);
if ( !myfile ){
std::cerr << "File named " << filename << " could not be opened!" << std::endl;
exit(EXIT_FAILURE);
}
std::string myString;
// std::vector <std::string> StartContents;
// std::vector <std::string> EndContents;
int numberOfStarts {0}, numberOfEnds {0};
if (myfile.is_open() && !myfile.eof() ) {
while (myfile.good()) {
std::getline(myfile, myString); // pipe file's content into stream
if (std::regex_search(myString, start)){
numberOfStarts++;
}
else if (std::regex_search(myString, end)){
numberOfEnds++;
}
else if ( myString.empty()){
std::cerr << "ERROR: Empty line found. Bad positions file. " << std::endl;
exit (EXIT_FAILURE);
}
}
}
if (numberOfStarts==numberOfEnds){
return numberOfStarts;
}
else {
std::cerr << "Number of starts is not the same as number of ends. Bad input file." << std::endl;
return 0;
}
}
当我 运行 这段代码时,我退出
std::cerr << "ERROR: Empty line found. Bad positions file. " << std::endl;
exit (EXIT_FAILURE);
错误。在打开 positions.txt 并删除最后一行之前,我无法找到错误。这里出了什么问题?为什么 Vim 会显示这样的内容?
我需要空行错误消息,因为我不希望输入文件中断。我希望每一行的坐标都不会破坏代码的其他部分。
如有任何建议,我将不胜感激。
编辑: 在 positions.txt 上使用 xxd,我得到以下结果
[faraway_server] src $ xxd positions.txt
00000000: 5354 4152 5420 504f 4c59 4d45 5220 310a START POLYMER 1.
00000010: 3120 3020 3020 0a32 2030 2030 0a33 2030 1 0 0 .2 0 0.3 0
00000020: 2030 0a34 2030 2030 0a34 2031 2030 0a35 0.4 0 0.4 1 0.5
00000030: 2031 2030 0a35 2030 2030 200a 3620 3020 1 0.5 0 0 .6 0
00000040: 3020 0a45 4e44 2050 4f4c 594d 4552 2031 0 .END POLYMER 1
00000050: 0a
接下来我该做什么?
最后一行文本后只有一个换行符 (\n
),因此您读到一个空行是因为您的程序存在错误。
这个:
while (myfile.good()) {
std::getline(myfile, myString);
应该是这样的:
while (std::getline(myfile, myString)) {
见Why is iostream::eof()
inside a loop condition (i.e. while (!stream.eof())
) considered wrong?
我有一个名为 position.txt
的文件,该文件已以特定方式格式化。这是position.txt的内容:
START POLYMER 1
1 0 0
2 0 0
3 0 0
4 0 0
4 1 0
5 1 0
5 0 0
6 0 0
END POLYMER 1
然而,当我使用 vi 查看 position.txt
时,我看到了这个:
当我在 sublime 中查看 positions.txt
时,我看到:
很明显,Sublime 中似乎多了一行,在 Vi 中不可见。这应该不是问题,但我是运行下面的代码:
int Grid::ExtractNumberOfPolymers(std::string filename){
std::regex start("START");
std::regex end ("END");
std::ifstream myfile (filename);
if ( !myfile ){
std::cerr << "File named " << filename << " could not be opened!" << std::endl;
exit(EXIT_FAILURE);
}
std::string myString;
// std::vector <std::string> StartContents;
// std::vector <std::string> EndContents;
int numberOfStarts {0}, numberOfEnds {0};
if (myfile.is_open() && !myfile.eof() ) {
while (myfile.good()) {
std::getline(myfile, myString); // pipe file's content into stream
if (std::regex_search(myString, start)){
numberOfStarts++;
}
else if (std::regex_search(myString, end)){
numberOfEnds++;
}
else if ( myString.empty()){
std::cerr << "ERROR: Empty line found. Bad positions file. " << std::endl;
exit (EXIT_FAILURE);
}
}
}
if (numberOfStarts==numberOfEnds){
return numberOfStarts;
}
else {
std::cerr << "Number of starts is not the same as number of ends. Bad input file." << std::endl;
return 0;
}
}
当我 运行 这段代码时,我退出
std::cerr << "ERROR: Empty line found. Bad positions file. " << std::endl;
exit (EXIT_FAILURE);
错误。在打开 positions.txt 并删除最后一行之前,我无法找到错误。这里出了什么问题?为什么 Vim 会显示这样的内容?
我需要空行错误消息,因为我不希望输入文件中断。我希望每一行的坐标都不会破坏代码的其他部分。
如有任何建议,我将不胜感激。
编辑: 在 positions.txt 上使用 xxd,我得到以下结果
[faraway_server] src $ xxd positions.txt
00000000: 5354 4152 5420 504f 4c59 4d45 5220 310a START POLYMER 1.
00000010: 3120 3020 3020 0a32 2030 2030 0a33 2030 1 0 0 .2 0 0.3 0
00000020: 2030 0a34 2030 2030 0a34 2031 2030 0a35 0.4 0 0.4 1 0.5
00000030: 2031 2030 0a35 2030 2030 200a 3620 3020 1 0.5 0 0 .6 0
00000040: 3020 0a45 4e44 2050 4f4c 594d 4552 2031 0 .END POLYMER 1
00000050: 0a
接下来我该做什么?
最后一行文本后只有一个换行符 (\n
),因此您读到一个空行是因为您的程序存在错误。
这个:
while (myfile.good()) {
std::getline(myfile, myString);
应该是这样的:
while (std::getline(myfile, myString)) {
见Why is iostream::eof()
inside a loop condition (i.e. while (!stream.eof())
) considered wrong?