从文本中读取行,删除空白并保存到新文件

C++ Reading lines from txt, removing white spaces and saving to new file

本文关键字:新文件 保存 文件 空白 文本 读取 删除      更新时间:2023-10-16

我可以征求一下意见吗?请,有人可以给代码的一个例子,它从第一个文本文件的行删除空间,并保存"没有空格的新文本"到第二个文件。我知道它可能是如何工作的,但我不能写它,因为我是编程初学者。谢谢你的建议。我的代码:

        //read csv file
         void readCSV(istream &input, vector< vector<string> > &output)
            {
                string csvLine;
                while(getline(input, csvLine) )
                {
                    istringstream csvStream(csvLine);
                    vector<string> csvColumn;
                    string csvElement;
                    while(getline(csvStream, csvElement) )
                    {
                        csvColumn.push_back(csvElement);
                    }       
                    output.push_back(csvColumn);
                }
            }

        //save all from csv to txt 
        void saveToTxt()
        {
            fstream file("file.csv", ios::in);
            ofstream outfile;
           outfile.open("file.txt");
            typedef vector< vector<string> > csvVector;
            csvVector csvData;
            readCSV(file, csvData);

            for(csvVector::iterator i = csvData.begin(); i != csvData.end(); ++i)
            {
                for(vector<string>::iterator j = i->begin(); j != i->end(); ++j)
                {
                    outfile<<*j<<endl;
                }

//code for deleting spaces, what i found, but i can't implement to above codes, coz my programming skill are not big
                   string s;   
                          while (getline( cin, s ))
                            {
                            s.erase(
                              remove_if(
                                s.begin(),
                                s.end(),
                                ptr_fun <int, int> ( isspace )
                                ),
                              s.end()
                              );
                            cout<<s<<endl;

我喜欢那些不会成为家庭作业结果的解决方案。下面是我将如何为规范编写代码,部分原因是我真的认为应该这样做,部分原因是为了给其他人一些有趣的阅读。它还包含了创建一个教师友好的解决方案所需的所有提示:

#include <algorithm>
#include <cctype>
#include <iterator>
int main() {
    std::remove_copy_if(
        std::istreambuf_iterator<char>(std::ifstream("in.txt").rdbuf()),
        std::istreambuf_iterator<char>(),
        std::ostreambuf_iterator<char>(std::ofstream("out.txt").rdbuf()),
        [](unsigned char c){ return std::isspace(c) && c != 'n'; });
}

如果你不能使用c++ 2011编译器,你需要用一个具有相同签名的实际函数来替换lambda函数

您可以通过使用与remove_if相同的想法来简化这一点,但是直接应用它来确定是否要复制。类似下面的代码。注意:没有测试,但我希望你能明白。

#include <iostream>
#include <iterator>
#include <fstream>
#include <functional>
#include <cctype>
using namespace std;
int main(int argc, char *argv[])
{
    ifstream is("file.csv", ios::in);
    ofstream os("file.txt", ios::out|ios::trunc);
    std::remove_copy_if(
        istream_iterator<char>(is),
        istream_iterator<char>(),
        ostream_iterator<char>(os),
        std::ptr_fun<int,int>(isspace));
    os.close();
    is.close();
    return 0;
}

编辑:我不敢相信Deitmar和我有几乎相同的想法。