Новичок C++: Передача fstream к функции для чтения данных

Мне назвали текстовый файл 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
}

Спасибо. Какие-либо критические анализы с тем, что там теперь?

6
задан physicsmichael 5 April 2010 в 23:18
поделиться

2 ответа

В первый раз, когда вы печатали переменную, вы печатали ее как 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"
}
7
ответ дан 10 December 2019 в 02:45
поделиться

Здесь у вас как минимум две проблемы.

В main():

  1. Вы должны передать строковый буфер в alt_reader, вместо этого вы передаете int.
  2. Похоже, вы хотите прочитать строку '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.

2
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: