Search code examples
c++file-handlinggoogletest

How to read from a file in C++ (during a GoogleTest)


UPDATED: I am learning about GoogleTest to test C/C++ programs. I heard GoogleTest is a good tool for it. I tried one simple thing, which is to read input from a file, during a TEST() function, and it did not seem to work:

test.cpp in the google test project:

#include <iostream>
#include <fstream>
#include <filesystem>

TEST(IOTest, ReadFile) {
    std::string filename = "input.txt";
    std::string buffer;
    std::ifstream ifs(filename, std::ios::binary);
    std::filesystem::path cwd = std::filesystem::current_path();
    std::cout << "Current directory path: " << cwd << std::endl;
    std::cout << "Current file path: " << __FILE__ << std::endl;
    ASSERT_TRUE(ifs.is_open());
}

The resulting test failed. And the output is:

Current directory path: "C:\\Users\\Tong\\source\\repos\\BookLibrary\\Debug"

Current file path: C:\Users\Tong\source\repos\BookLibrary\GoogleTest\test.cpp

    Value of: ifs.is_open()
      Actual: false
    Expected: true

I placed the file "input.txt" under the current directory, which is:

C:\Users\Tong\source\repos\BookLibrary\GoogleTest\Debug\input.txt

but it seems that the program cannot find or open it.

Am I missing something here? I also tried

std::string filename = "./input.txt";

but still no luck in reading the file.

UPDATE: problem solved; everything was correct except that I had placed the input.txt file in the wrong folder. It should be placed in

C:\Users\Tong\source\repos\BookLibrary\Debug

and not

C:\Users\Tong\source\repos\BookLibrary\GoogleTest\Debug

Solution

  • Thanks to multiple comments in the original question, I found the root cause of my problem: I did not find my current directory path correctly.

    I thought the current directory path was the project directory of the Google Test project. But it was not true. My current directory path was the other project that hosts my main() function. After knowing this, I placed the file to be read from into the correct current directory path, and the code worked.