6

我有一个名为num.txtwho's only contents is the line的文本文件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 仍然在 main 中分配变量吗?我这样做是因为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
}

谢谢。对现在的情况有什么批评吗?

4

2 回答 2

7

第一次打印变量时,您将其打印为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"
}
于 2010-04-05T22:16:47.267 回答
2

你在这里至少有两个问题。

在 main() 中:

  1. 您应该将字符串缓冲区传递给alt_reader,而不是传递一个 int。
  2. 您似乎想读取字符串'123',但希望 int 具有 value 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;并执行了从字符串(a scii)到 intalt_reader的转换。atoi

于 2010-04-05T22:25:59.523 回答