问题
I have a simple question that is confusing me.
Goal: I want to read a given byte from a file (say the first byte) and make int x with the ASCII value of that byte. So, for example, if the byte/character is 'a', I want x to be 97 (= 61 in hex). I have the following reading the first byte of the file example.txt:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
unsigned int x;
unsigned char b;
ifstream myFile ("example.txt", ios::out | ios::binary);
myFile.seekg (0, ios::beg);
myFile >> b;
x = (unsigned int)b;
cout << hex << x;
return b;
}
Problem: If the first byte is represented by 08, then indeed I get an output of 8. But if the byte is represented by 09, then I get 0. I have noticed that I seem to get the following byte unless that byte is also 09. I don't know if my problem is only when the byte is represented in ASCII by 09.
Question: So how to I read say the first (or third or whatever) byte from a file and make an int with the ASCII value of that byte?
(I am on Windows XP)
回答1:
This should fix it.
myFile >> noskipws >> b;
回答2:
Couple of suggestions:
- Check if the file has actually been opened. If it wasn't, ensure the file is in the current dir, or supply the full path.
- You probably want
ios::in
(notios::out
). - Use
noskipws
unless you actually want to skip whitespaces. - What's the purpose of returning the character? The convention is to interpret a non-zero exit code as a failure (though admittedly, there is no strict standard on this).
The following program reads the 4th character and prints its HEX value just fine for me:
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main() {
ifstream myFile("<path>\\example.txt", ios::in | ios::binary);
if (myFile) {
unsigned char b;
myFile.seekg(3) >> noskipws >> b;
if (myFile) { // File was long enough?
unsigned int x = b;
cout << hex << x;
return EXIT_SUCCESS;
}
}
return EXIT_FAILURE;
}
(Replace <path>
with actual path.)
回答3:
Try reading using ifstream::read
instead of operator>>
. This has worked for me:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
unsigned int x;
unsigned char b;
ifstream myFile ("example.txt", ios::out | ios::binary);
myFile.seekg (0, ios::beg);
myFile.read(reinterpret_cast<char*>(&b), sizeof(b));
x = (unsigned int)b;
cout << hex << x;
return b;
}
来源:https://stackoverflow.com/questions/9542519/how-to-read-a-byte-and-save-ascii-value-of-byte-in-integer-in-c