Я пытаюсь настроить поток файлов или что-то в этом роде, но я очень озадачен тем, что я должен делать - PullRequest
1 голос
/ 22 февраля 2012
#include <iostream>
#include <fstream>

int main() {
    std::ofstream outfile("text.txt", ios::trunc);
    std::ifstream infile("text.txt", ios::trunc);

    outfile.seekp(0);

    std::cout << "This is a file";

    infile.seekg(0, ios::end);
    int length = infile.tellg();
    infile.read(0, length);

    infile.close();
    outfile.close();
    return 0;
}

Я думаю, что у меня есть идея, но я чувствую, что (и я почти уверен), я понятия не имею, что я делаю. Я посмотрел это, и все меня смутило. Я прочитал ссылку на C ++, а потом погуглил, но все еще не понимаю, что делаю неправильно.

#include <iostream>
#include <fstream>
#include <cstring>

int main() {
    std::fstream file("text.txt", std::ios_base::in | std::ios_base::out);

    file << "This is a file";
    int length = file.tellg();

    std::string uberstring;
    file >> uberstring;
    std::cout << uberstring;

    char *buffer = new char[length + 1];
    file.read(buffer, length);
    buffer[length] = '\0';

    file.close();
    delete [] buffer;

    return 0;
}

Я попробовал это, но ничего не печатается. Почему это не работает?

1 Ответ

1 голос
/ 22 февраля 2012

Если вы хотите читать и записывать в один и тот же файл, просто используйте обычный std::fstream ... нет необходимости пытаться открыть тот же файл, что и ifstream и ofstream.Также, если вы хотите записать данные в файл, используйте operator<< для фактического fstream объекта экземпляра, а не std::cout ..., который будет просто записывать туда, где установлен std::cout, который обычно является консолью.Наконец, вызов read должен вернуться в буфер, вы не можете использовать NULL в качестве аргумента.Таким образом, ваш код изменится на следующее:

int main() 
{
    std::fstream file("text.txt", ios_base::in | ios_base::out);

    //outfile.seekp(0); <== not needed since you just opened the file

    file << "This is a file"; //<== use the std::fstream instance "file"

    //file.seekg(0, ios::end); <== not needed ... you're already at the end
    int length = file.tellg();

    //you have to read back into a buffer
    char* buffer = new char[length + 1];
    infile.read(buffer, length); 
    buffer[length] = '\0'; //<== NULL terminate the string

    file.close();
    delete [] buffer;

    return 0;
}
...