【问题标题】:Saving text file in it's entirety完整保存文本文件
【发布时间】:2015-01-28 05:56:21
【问题描述】:

我需要帮助来编写正确的方法来保存文本文件的内容。到目前为止,我已经设法保存并创建了一个文本文件,但是当我打开它时,它总是空的。我正在使用 Visual Studio 2012 并使用 c++-CLI 创建一个 Windows 窗体。

这就是我所拥有的:

private: System::Void saveToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
          {
  IO::Stream^ myStream;
  SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
  saveFileDialog1->Filter = "txt files (*.txt)|*.txt";
  saveFileDialog1->FilterIndex = 1;
  saveFileDialog1->RestoreDirectory = true;
  if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
  {
     if ( (myStream = saveFileDialog1->OpenFile()) != nullptr )
     {

        // Code to write the stream goes here.
        myStream->Close();
     }
  }
}

基本上,我正在尝试实现下面的代码,唯一不同的是我使用的是 c++-CLI 而不是 c#,而不是在文件中写入一些文本为 (bw.Write("Example text file." ) 确实,我希望文本文件将我的文本框值保存在我的 Windows 窗体中,例如 bw.Write(txtTextBox1->Text)。但就我而言,c++ 不使用这些相同的命令c# 可以。

SaveFileDialog sgd = new SaveFileDialog();
sfd.Filter = "Text File|*.txt";
sfd.FileName = "My Text File";
sfd.Title = "Save Text File";
if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
    string path = sft.FileName;
    BinaryWriter bw = new BinaryWriter(File.Create(path));
    bw.Write("Example text file.");
    bw.Dispose();
}

这是我的程序的一些图像。我还附上了一张打印预览按钮的图片。我基本上希望我的保存按钮保存一个文本文件,其中包含我的打印预览显示的内容。


【问题讨论】:

  • 您可能将文件保存为 Unicode,但没有像这样读取它。
  • 截图是怎么回事?它们与这个问题有什么关系?就问题而言:您可以在 C++/CLI 中编写与在 C# 中编写的完全相同的内容。那么为什么 C++ 代码看起来不像 C# 代码呢?您在 C++ 中发布的代码从未编写任何内容,因此结果是一个空文件也就不足为奇了。见stackoverflow.com/help/mcve。最后,不要忘记使用using 来处理IDisposable 对象,例如您的对话框和BinaryWriter
  • 顺便说一下BinaryWriter:即使在C#代码中,这也是值得怀疑的,因为BinaryWriter不太适合编写文本文件。请改用StreamWriter(C# 和 C++/CLI)。
  • @PeterDuniho 你能发布一个关于如何使保存按钮写入的示例。

标签: .net visual-studio visual-studio-2012 visual-c++ c++-cli


【解决方案1】:

为什么有人想在 C++/CLI 中实现 Forms 程序,这超出了我的理解。 C++/CLI 在很多方面都很棒,但对于纯粹托管的东西(比如 Forms API),我认为 C# 更好。代码示例比较多,语法一般比较简洁方便。

也就是说,这里是您包含的 C# 代码的 C++/CLI 版本,稍有改动的是它使用 StreamWriter 而不是 BinaryWriter

SaveFileDialog^ sfd = gcnew SaveFileDialog();

try
{
    sfd->Filter = "Text File|*.txt";
    sfd->FileName = "My Text File";
    sfd->Title = "Save Text File";
    if (sfd->ShowDialog() == DialogResult::OK)
    {
        String^ path = sfd->FileName;
        StreamWriter^ writer = gcnew StreamWriter(File::Create(path));
        try
        {
            writer->Write("Example text file.");
        }
        finally
        {
            delete writer;
        }
    }
}
finally
{
    delete sfd;
}

请注意,除了一些细微的语法差异和缺少 C# 的 using 方便习语外,它与 C# 代码基本相同。您将在其余的实现中看到类似的相似之处。 C++/CLI 使用(或至少,可以使用)与 C# 中使用的完全相同的方法。

【讨论】:

  • 由于某种原因,在 StreamWriter^ 上,writer、StreamWriter 和 File 单词都带有下划线作为错误。对于 StreamWriter^ 和 writer 它说未定义,对于 StreamWriter 它说期望一个类型说明符,对于 File 它说错误名称后跟 :: 必须是类或命名空间名称。有什么想法吗?
  • .h 或 .cpp 中有using namespace System::IO; 吗?
  • 非常感谢您的帮助。我知道 c# 会是一个更好的选择,但我的教授给了我们这个任务。
  • 你知道与 & vbCrLf & 等价的写一个新行吗?似乎我的所有文本都已保存但在同一行。如何给作者添加换行符?
  • 通常,您只需调用WriteLine() 方法而不是Write()。但如果需要显式输出换行符,可以使用Environment.NewLine
【解决方案2】:

这是 C# 代码的替代方案...

使用 Unicode 字符集的 UTF-8 编码将文本写入文件(这是 .NET 字符串使用的字符集):

private: System::Void saveToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
{
    SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
    saveFileDialog1->Filter = "txt files (*.txt)|*.txt";
    saveFileDialog1->FilterIndex = 1;
    saveFileDialog1->RestoreDirectory = true;
    if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
    {
       File::WriteAllText(saveFileDialog1->FileName, "Example text file.");
    }
}

【讨论】:

  • 这行代码应该放在哪里?我已经替换了行 writer->Write("Example text file.");使用您的代码,但是当我单击保存时,一旦键入文件名、位置并单击保存,就会显示空路径名不合法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
相关资源
最近更新 更多