Мне назвали текстовый файл num.txt
то, кто только содержание, является строкой 123
. Затем у меня есть следующее:
void alt_reader(ifstream &file, char* line){
file.read(line, 3);
cout << "First Time: " << line << endl;
}
int main() {
ifstream inFile;
int num;
inFile.open("num.txt");
alt_reader(inFile, (char*)&num);
cout << "Second Time: " << num << endl;
}
Вывод:
First Time: 123
Second Time: 3355185
Можно ли помочь мне выяснить, как получить fstream, который читается в функции, все еще присваивают переменную в основном? Я делаю это потому что alt_reader
действительно имеет намного больше к нему, но это - часть, на которой я застреваю. Большое спасибо за справку.
ОБНОВЛЕНИЕ: Используя комментарии Bill Oneal, записал я
void alt_reader(ifstream &file, stringstream &str, int n){
char buffer[n+1];
file.read(buffer, n);
buffer[n] = 0;
str << buffer;
cout << "First Time: " << buffer << endl; //First Time: 123
}
int main() {
ifstream inFile;
stringstream strm;
int num;
inFile.open("num.txt");
alt_reader(inFile, strm, 3);
cout << "Second Time: " << num << endl; //Second Time: 123
}
Спасибо. Какие-либо критические анализы с тем, что там теперь?
В первый раз, когда вы печатали переменную, вы печатали ее как char *
, обрабатывая файл как текстовый файл (и вам повезло, что вы не разбились). Во второй раз, когда вы распечатали его, вы переосмыслили его как int
, сделав представление совершенно другим.
Каждый раз, когда вы приводите указатели от одного типа к другому, вы обычно вызываете неопределенное поведение. Поскольку char
не имеет стандартного отношения к int
, он у вас здесь.
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш вопрос-комментарий:
#include <sstream>
void foo(std::stream &str) {
str << "42\n";
};
int main() {
int aNumber;
std::stringstream aStringStream;
foo(aStringStream); //Pass our stream to the function. It contains
//"42\n" when the function returns.
aStringStream >> aNumber; //aNumber == 42
aNumber += 10; //aNumber == 52;
std::cout << aNumber; //Print "52"
}
Здесь у вас как минимум две проблемы.
В main():
alt_reader
, вместо этого вы передаете int. '123'
, но хотите, чтобы int имел значение 123
. Можно сделать так:
void alt_reader(ifstream &file, char* line){
file.read(line, 3);
line[3]=0;
cout << "First Time: " << line << endl;
}
int main() {
ifstream inFile;
inFile.open("num.txt");
char buffer[128];
alt_reader(inFile, buffer);
int num=atoi(buffer);
cout << "Second Time: " << num << endl;
return 0;
}
Обратите внимание, что я добавил line[3]=0;
к alt_reader
, а atoi
выполняет преобразование из строки (a scii) в int.