C ++文件流:创建的文件名以奇怪的符号结尾

时间:2014-09-19 19:34:18

标签: c++ windows c++11 fstream

所以我一直在使用文件流,我想出了一个问题。每次我尝试保存文件时,创建的文件的名称都以这两个字符结尾:i' 。 有什么方法可以解决这个问题吗?

这是我得到的:

Capture

这是我的代码:

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <stdlib.h>
    #include <windows.h>
    #include <cstdlib>
    #include <stdio.h>
    #include <cstdio>
    #include <fstream>

    using namespace std;

    string p = "";
    string some_string;

    char o[20];

    int _tmain(int argc, _TCHAR* argv[])
    {
        cout << "Choose a name for your file: ";

        getline(cin, p);

        if (p.length() >= 20)
        {
            cout << "Max character length: 20 characters\n\n";
            system("pause");
            exit(EXIT_SUCCESS);
        }
        else
        {
            ofstream out("resources");
            out.trunc;
            out << p;
            out.close();
        }

        for (int i = 0; i < 20; i++)
        {
            o[i] = ' ';
        }

        for (unsigned int t = 0; t < p.length(); t++)
        {
            o[t] = p.at(t);
        }

        ofstream save(o);

        save << some_string;

        save.close();

        cout << "A new file named: '" << p << "' was created\n";
        Sleep(2500);

    }

(我使用Microsoft VS 2013)

提前致谢!

1 个答案:

答案 0 :(得分:1)

您已将o预先初始化为所有空格,但这无用。你应该做的是写一个&#39; \ 0&#39;到你的文件名的最后一个字符之后的字符。否则阵列是非终止的,你可能会得到垃圾&#34;最后,当你将它用作C字符串时。

所以:

for (unsigned int t = 0; t < p.length(); t++) {
    o[t] = p.at(t);
}

o[p.length()] = '\0';

您还应该将错误消息更改为以下内容,以使其准确无误:

cout << "Max character length: 19 characters\n\n";

如果你对std::string使用o会更容易,那么你根本不必弄乱char数组和循环。事实上,由于o只是p中字符的副本,因此您可以完全忘记o,只使用p本身:

ofstream save(p);

那就是说,在C ++ 03中,你可能必须从p获得一个C字符串,因为ofstream构造函数还没有接受std::string

ofstream save(p.c_str());

(我不记得,但我认为MSVS无论如何都允许std::string参数。)