从同一文件读取和写入? [英] Reading and Writing from same file?

查看:63
本文介绍了从同一文件读取和写入?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在文件中存储一些数据,但是之后

i am storing some data in the file but after

如果(titlemap.count(words [i])== 1)

if (titlemap.count(words[i]) == 1)

达到

我重新打开文件并读取矢量中的所有数据,然后存储更新的数据,但是但是实际上该程序不会进入下面的循环.

is reached i reopened the file and reading all data in a vector and then storing updated data but But actually the program is not going into the below loop.

for(int j = 0; j< vec.size(); j ++)谁能说出为什么呢?我非常困惑和沮丧

for (int j = 0; j < vec.size(); j++) Can anyone suggest why is it so? I am very confused and frustrated


// Cmarkup1.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include"Markup.h"
#include <msxml.h>
#include <ctime>
#include <unordered_map>
#include <cctype>
#include <string>
#include <functional>
#include <algorithm>
#include "functions.h"
#include <map>
#include <fileapi.h>
using namespace std;
int main()
{

    // Open the file for parsing.
    ofstream wfile("title.txt");
    bool check = false;
    string delimiter = " ,:,";

    int results = 0, pages = 1;
    time_t timer;
    timer = clock();
    CMarkup xmlfile;

    unordered_map<string, string> titlemap;
    unordered_map<string, string> textmap;
    vector <string> words;

    xmlfile.Load(MCD_T("simplewiki-latest-pages-articles.xml"));
    xmlfile.FindElem();
    xmlfile.IntoElem();
    int line=0;

    while (xmlfile.FindElem(MCD_T("page"))) {

        xmlfile.IntoElem();
        xmlfile.FindElem(MCD_T("title"));
        MCD_STR(title);
        title = xmlfile.GetData();
        string str(title.begin(), title.end());
        transform(str.begin(), str.end(), str.begin(), ::tolower);
        split(words, str, is_any_of(delimiter));

        for (int i = 0; i < words.size(); i++) {
            if (titlemap.count(words[i]) == 1) {
                ifstream rfile;
                rfile.open("title.txt");
                vector<string> vec;
                string line;
                while (getline(rfile, line)) {
                    vec.push_back(line);
                }
                for (int j = 0; j < vec.size(); j++) {
                    if (words[i] == vec[j]) {
                        cout << vec[j] <<"Checking"<< endl;
                        wfile << vec[j] << ",page" << pages << endl;
                    }
                    else
                        wfile << vec[j] << endl;
                    //wfile.close();
                }
            }
            else {
                //wfile.open("title.txt");
                keeponlyalphabets(words[i]);
            titlemap.insert(make_pair(words[i], words[i]));
            wfile << words[i] <<"-page"<<pages<< endl;
            ++line;
            }
        }
            words.clear();
            //cout << str << endl;
            //xmlfile.FindElem(MCD_T("text"));
            //MCD_STR(text);
            //text = xmlfile.GetData();
            //string str1(text.begin(), text.end());
            //transform(str1.begin(), str1.end(), str1.begin(), ::tolower);
            //str1 = keeponlyalphabets(str1);
            //removestopwords(str1);
            //textmap.insert(make_pair(str1, str1));
            //cout << str1 << endl;
            if (pages > 100)
                break;
            pages++;
            xmlfile.OutOfElem();


        }
    wfile.close();

    //  for (auto it : titlemap)
        //  cout << it.first << endl;
        cout << "Total lines are as:  "<<line << endl;
        /*string input;
        cout << "press s to seach the data" << endl;
        getline(cin, input);
        if (input == "s") {

            string key;
            cout << "Enter Key" << endl;
            cin >> key;
            transform(key.begin(), key.end(), key.begin(), ::tolower);
            size_t temp;
            cout << endl;
            for (auto it = data.begin(); it != data.end(); it++) {
                //temp = it->first.find(key);
                //cout << temp;
                if (it->first.find(key) != std::string::npos) {
                    cout << it->second << endl;
                    results++;
                }
            }

        }
        else
            cout << "Invalid Character Exiting....." << endl;
        timer = clock() - timer;
        cout << "Total time taken by the process is:  " << (float)timer / CLOCKS_PER_SEC << endl;
        cout << " Total Results : " << results << endl;
        */
        return 0;
    }

推荐答案

您已针对文件打开了单独的流,每个流上都有单独的缓冲区.对文件的 write 写入实际上实际上很少写入磁盘(通常是在缓冲区已满时,这可能需要一段时间才能进行较小的写入,并且总是在关闭文件之前).因此,当您重新打开文件进行读取时,它不会看到任何残留在用户空间缓冲区中的东西.

You have separate streams opened against the file, with separate buffers on each. writeing to a file only actually writes to disk infrequently (typically when a buffer fills, which may take a while for small writes, and always just before the file is closed). So when you re-open the file for read, it won't see anything still stuck in user-space buffers.

只需添加:

wfile.flush()

在打开以进行读取之前,请确保将缓冲区刷新到磁盘上并供备用句柄使用.

prior to opening for read, to ensure the buffers are flushed to disk and available to the alternate handle.

这篇关于从同一文件读取和写入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆