How do you read hard disk sectors in C++ with gcc/linux? Is there a standard library that I can use or must something be downloaded? In Windows I can use CreateFile(...) to acce
you can dump disk sectors to a file with the dd command and read the file generated
As others have correctly pointed out, disk access on Linux (and other Unix-like operating systems) is via a device special file. On my Ubuntu laptop, my hard drive is named "/dev/sda".
Since you specifically ask how to do it in C++ (not merely how to do it in Linux), here is how to read one sector using std::ifstream
.
#include <fstream>
#include <cerrno>
#include <stdexcept>
#include <cstring>
#include <vector>
int main() {
// Which disk?
char diskName[] = "/dev/sda";
std::string diskError = std::string() + diskName + ": ";
// Open device file
std::ifstream disk(diskName, std::ios_base::binary);
if(!disk)
throw(std::runtime_error(diskError + std::strerror(errno)));
// Seek to 54321'th sector
disk.seekg(512 * 54321);
if(!disk)
throw(std::runtime_error(diskError + std::strerror(errno)));
// Read in one sector
std::vector<char> buffer(512);
disk.read(&buffer[0], 512);
if(!disk)
throw(std::runtime_error(diskError + std::strerror(errno)));
}
The hard disk is just another file (not a "regular file" but a "device file", but still, a file). Open it the normal way...
int fdes = open("/dev/sda1", O_RDONLY);
if (fdes < 0)
err(1, "/dev/sda1");
... do more ...
You will get permission errors unless you have the right permissions. Note that "/dev/sda1"
is just an example, it is the first partition on disk sda
, the exact path will depend on your system. You can list mount points with the mount
command, and you can access entire disks (instead of just partitions) using /dev/sda
, /dev/sdb
, etc.
You could also open it as a C++ fstream
or C FILE
, but I do not recommend this. You will have a better time finding example code and getting help on forums if you use open
instead.