getline(file, text) 表现出奇怪的行为:卡在阅读幽灵行

getline(file, text) exhibits strange behavior : stuck reading a ghost line

我对 getline 在以下代码中表现出的奇怪行为感到困惑

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main() {
    string password = "cat";
    string inputFileName = "text.txt";
    string content = ""; 

    ifstream file;
    file.open(inputFileName);
    
    if(file.fail()) {
        cout << "error opening the file" << endl;
    }
    getline(file, content);

    file.close();
    cout << "The content of the file is: " << content << endl;
}

文件text.txt的内容原本是一行:"This is a generic text to be encrypted",被正确复制到字符串content.

每当我更改文件中的文本或删除其内容、保存它并再次 运行 程序时,相同的旧字符串总是被复制到文本字符串变量中。更奇怪的是,即使删除文件,也不会抛出任何错误,被删除的文件仍然被打开并且 getline(file, text) 仍然将相同的字符串分配给文本,如调试器和打印语句所示。

这是怎么回事?

这应该是一个简单的学习练习。如果对我在 Windows 10 上使用 qtcreator 有帮助,给我的 Cmake 文件具有以下内容:

cmake_minimum_required(VERSION 3.5)

project(encryption LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(encryption main.cpp)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/text.txt
     DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

显然,您的程序并非 运行来自您认为的目录。

我发现

Visual Studio 在这方面特别糟糕。您需要进入项目的属性并查看当前目录设置的位置。或者 运行 自己从终端上获取。

编辑您能找到的该文本文件的每个副本,并使每个副本都独一无二,然后您将看到正在使用的是哪个。

同样重要的是要知道,在执行 cmake 时,CMake 只会 运行 一次执行这些文件复制操作。不是每次构建项目时。您可以安排这样做,但这将是一个自定义目标,而不是文件(复制)操作。

除了重复文件问题,另一个明显的问题是只输出消息:

 cout << "error opening the file" << endl; 

不会使程序不执行以下行,如果文件未正确打开,您需要停止执行处理文件的其余代码。

示例:

if (file.fail()) // IMO prefer if(!file.is_open())
{
    cout << "error opening the file" << endl;
}
else
{
    getline(file, content);
    file.close();
    cout << "The content of the file is: " << content << endl;
}