将文件保存到 C++ 中用户输入定义的位置和名称

Posted

技术标签:

【中文标题】将文件保存到 C++ 中用户输入定义的位置和名称【英文标题】:Save file to location and name defined by user input in C++ 【发布时间】:2011-04-05 23:29:39 【问题描述】:

我在将控制台窗口中创建的文本文件保存到用户输入定义的自定义位置时遇到了一些问题。我希望它采用字符串filepath,这将是保存位置,并将它与字符串filename结合起来,这将是用户选择的文本文件的名称。比如这个C:\users\bobbert\desktop\c++.txt 然后我想要第三个字符串,它是要写入 c++.txt 文件的实际文本。这是我的代码:

cout<<"Please enter a name for your file: "<<endl;
cin>>filename;

cout<<"Please enter a directory to save your file in: "<<endl;
cin>>filepath;

//user is now typing data into the text file
cin>>data;
//the data is now being grabbed and put into the "Data" string

FILE * pFile;
pFile = fopen (filepath.c_str() + filename.c_str(),"a");

//trying to combine the users selected directory + the selected filename here

if (pFile!=NULL)

    fputs(data.c_str(), pFile);
    //here i am trying to take the data of the .txt file
    //string and put it into the new file


fclose (pFile);

感谢您抽出宝贵时间阅读本文! :)

【问题讨论】:

为了将来的参考,最好能真正描述出问题所在。你从来没有在这里问过问题。 【参考方案1】:

filepath.c_str() + filename.c_str() 不连接字符串,因为它们是指向字符数组的指针,而不是 C++ std::string 对象。您只是在 [尝试] 对指针执行算术运算。

试试:

std::string filename, filepath, data;

cout << "Please enter a name for your file: " << endl;
cin >> filename;

cout << "Please enter a directory to save your file in: " << endl;
cin >> filepath;

//user is now typing data into the text file
cin >> data;

//the data is now being grabbed and put into the "Data" string
ofstream fs((filepath + "/" + filename).c_str(), ios_base::app);

//trying to combine the users selected directory + the selected filename here
if (fs)
   fs << data;

我已经用 C++ 流对象替换了您对 C 风格 fopen 的使用,修复了您的字符串问题并在 filepathfilename 之间添加了一个反斜杠(以防用户不写它)。

请注意,在将完成的路径传递给ofstream 的构造函数时,您仍然需要对串联的std::string 结果执行.c_str(),因为iostreams 是在字符串库之前设计的。这只是一个讨厌的 C++ 主义。

【讨论】:

+1,但实际上他并没有执行指针运算,因为指针无法求和(该行可能会引发编译错误)。 @Matteo:尝试* :) 当然,他做不到是他问题的根源,如果他能做到,那么问题只会稍微难以发现和调试。顺便说一句,我们通常说“行”,而不是“行”。【参考方案2】:

真正的 C++ 精神

#include <iostream>
#include <fstream>
#include <string>

int main()

    std::string filename, filepath, data;

    std::cout << "Please enter a name for your file: " << std::endl;
    std::cin >> filename;

    std::cout <<" Please enter a directory to save your file in: " << std::endl;
    std::cin >> filepath;

    std::ofstream file((filepath + "/" + filename).c_str());

    //std input is being copied to the file
    file << std::cin.rdbuf();
    file << std::flush;
    file.close();

    return 0;

C精神结合路径


    char* fspec;
    if (-1 == asprintf(&fspec, "%s/%s", filepath.c_str(), filename.c_str()))
         perror("asprintf"); return 255; 
    std::cout << fspec << std::endl;
    free(fspec);

我并不清楚您需要如何处理输入; 如果您愿意,可以通过多种方式使用字符串流将其读取到内存缓冲区,例如 不丢失空格:

std::stringstream ss;
ss << std::cin.rdbuf();

// OR
std::copy(std::istreambuf_iterator<char>(std::cin) ,
        std::istreambuf_iterator<char>(),
        std::streambuf_iterator<char>(ss));

....以及一些删除空格的替代方法:

std::copy(std::istream_iterator<std::string>(std:: cin),
        std::istream_iterator<std::string>(),
        std::stream_iterator<std::string>(ss));

bool my_isspace(char c)  return std::isspace(c);  // in namespace scope
std::remove_copy_if(std::istreambuf_iterator<char> (std::cin),
        std::istreambuf_iterator<char>(),
        std::streambuf_iterator<char>(ss), my_isspace);

【讨论】:

嘿,这太棒了!正是我想要的。但是有一个问题,它每次都会删掉第一个单词。例如,我在控制台中输入“Hello Sally”,在文本文件中显示“Sally”。另外我一直在使用 ctrl+C 退出,因为 enter 不起作用(这很好,因为我需要能够写多于一行)是否有正确的退出方法?谢谢! 我的代码没有删减,请参阅here。我很确定您从旧代码中留下了流浪的cin&gt;&gt;data 语句?计算机习惯于听从你的命令 :) 正确的退出方式是 EOF(在 UNIX/linux 上为 Ctrl-D,在 Windows 上为 Ctrl-Z) 当然,我忘了从旧代码中删除 cin>>数据。现在它可以工作了,除了 Ctrl-Z 的东西。对我来说,它只在 Ctrl-C 上退出。 Ctrl-z 对你有用吗?我在 Windows 7 32 位上。 虽然我确信学习如何驯服 Windows 控制台键盘不是您的课程目标,但我只是启动了一个旧的 Windows 虚拟机,然后看:Ctrl-Z 有效。试试copy con: nul:。顺便说一句,如果您的键盘正在弹奏,您可以尝试 F6 插入 Ctrl-Z【参考方案3】:

用户是否使用反斜杠终止输入字符串?如果不是,那么你的路径是错误的。

【讨论】:

以上是关于将文件保存到 C++ 中用户输入定义的位置和名称的主要内容,如果未能解决你的问题,请参考以下文章

将数据保存到txt文件中? C++

将用户输入保存在 json 文件中

关于c++文件流读入和写入的问题

如何通过用户输入打开文件? C++

C++编写一个程序,将用户输入的十进制整数转换成任意进制的数

使用 CGI C++ 下载文件