Создать текстовый файл и записать его в C ++? - PullRequest
12 голосов
/ 19 марта 2011

Я использую Visual C ++ 2008. Я хочу создать текстовый файл и записать в него.

char filename[]="C:/k.txt";
FileStream *fs = new FileStream(filename, FileMode::Create, FileAccess::Write);
fstream *fs =new fstream(filename,ios::out|ios::binary);
fs->write("ghgh", 4);
fs->close();

Здесь отображается ошибка FileStream

Ответы [ 3 ]

14 голосов
/ 19 марта 2011

Вы получаете ошибку, потому что fs объявлено дважды двумя разными способами; но я бы ничего не сохранил в этом коде, так как это странное сочетание C ++ и C ++ / CLI.

По вашему вопросу не ясно, хотите ли вы делать стандартные C ++ или C ++ / CLI; предполагая, что вы хотите "нормальный" C ++, вы должны сделать:

#include <fstream>
#include <iostream>

// ...

int main()
{
    // notice that IIRC on modern Windows machines if you aren't admin 
    // you can't write in the root directory of the system drive; 
    // you should instead write e.g. in the current directory
    std::ofstream fs("c:\\k.txt"); 

    if(!fs)
    {
        std::cerr<<"Cannot open the output file."<<std::endl;
        return 1;
    }
    fs<<"ghgh";
    fs.close();
    return 0;
}

Обратите внимание, что я удалил все вещи new, так как очень часто вам это не нужно в C ++ - вы можете просто выделить объект потока в стеке и забыть об утечках памяти, которые присутствовали в вашем коде, так как обычно (не управляемые GC) указатели не подлежат сборке мусора.

4 голосов
/ 19 марта 2011

Вот примеры как для собственного, так и для управляемого C ++:

Предполагая, что вы довольны собственным решением, следующие прекрасно работают:

    fstream *fs =new fstream(filename,ios::out|ios::binary); 
fs->write("ghgh", 4); 
fs->close(); 
delete fs;      // Need delete fs to avoid memory leak

Однако я бы не использовал динамическую памятьдля объекта fstream (т.е. новый оператор и точки).Вот новая версия:

    fstream fs(filename,ios::out|ios::binary); 
fs.write("ghgh", 4); 
fs.close();

РЕДАКТИРОВАТЬ, вопрос был отредактирован для запроса нативного решения (изначально оно было неясно), но я оставлю этот ответ, так как он может быть кому-то полезен

Если вы ищете опцию CLI C ++ (для управляемого кода), я рекомендую использовать StreamWriter вместо FileStream.StreamWriter позволит вам работать с управляемыми строками.Обратите внимание, что delete вызовет метод Dispose в интерфейсе IDisposable, а сборщик мусора в конце концов освободит память:

StreamWriter ^fs = gcnew StreamWriter(gcnew String(filename));
fs->Write((gcnew String("ghgh")));
fs->Close();
delete fs;
0 голосов
/ 02 апреля 2014

вы создаете текст.Спросите пользователя, хочет ли он отправить его.Если он говорит «да», это означает, что это конкретное сообщение должно быть помечено как исходящее сообщение, в противном случае это должно быть входящее сообщение.

...