brak zapisu do pliku csv

0

Witam wszystkich,

Jako, że jestem nowy na forum, jak i zaczynam programowanie w c++ proszę o wyrozumiałość :)
Piszę program który wyciąga mi szukany wyraz w pliku .txt i wyświetla mi ten wyraz wraz z całym wierszem, w którym się znajduje.
Po pobraniu danych, powinno zapisać wszystko do pliku, któremu nadaje sam nazwę.

Problem polega na tym, że jak wstawię zwykły tekst w "" to wstawia mi do pliku, a jak wpiszę zmienną, to już nie.
Poniżej kod


#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

fstream plikwy;

int main()
{
    char saveFile[ 256 ];
    char FileName[ 256 ];
    char SearchWord[ 256 ];
    char tmp[ 1024 ];
    string line;
   
    cout << "Podaj aktualną datę np. [2018/01 ";
    cin >> SearchWord;
    cout << "\n\n";
    cout << "Nazwa pliku do przeszukania: ";
    cin >> FileName;
    std::ifstream file( FileName );
    std::string line1;
   
    ifstream FileSearch( FileName );
    ifstream inputfile;
   
    size_t pos;
    inputfile.open( FileName );
    if( inputfile.is_open() )
    {
        while( !FileSearch.eof() )
        {
            while( getline( inputfile, line ) )
            {
                pos = line.find( SearchWord );
                if( pos != string::npos ) // string::npos is returned if string is not found
                {
                    cout << line << "\n";
                   
                }
            }
            cout << "Podaj nazwe pliku do ktorego zapisac\n";
            cin >> saveFile;
            ofstream plikout( saveFile );
           
            plikwy.open( saveFile, ios::out );
            if( plikwy.good() )
            {
                plikwy << line;
                plikwy.close();
            }
            cin.get();
            break;
        }
    }
   
    system( "PAUSE" );
   
    return 0;
}

0

Problem polega na tym, że jak wstawię zwykły tekst w "" to wstawia mi do pliku, a jak wpiszę zmienną, to już nie.

Niestety ciężko zrozumieć o co Ci chodzi - napisz to zdanie ponownie.

0

To od początku :)

Program, który napisałem działa w 50%, wpisuję wyraz, skrypt wyszukuje mi wyraz w pliku, w którym chcę, wyświetla mi wszystkie wiersze z pliku w którym znajduje się wyraz i następnym krokiem powinno być zapisanie tych wierszy w plik CSV:

 cout << "Podaj nazwe pliku do ktorego zapisac\n";
            cin >> saveFile;
            ofstream plikout( saveFile );

            plikwy.open( saveFile, ios::out );
            if( plikwy.good() )
            {
                plikwy << line;
                plikwy.close();
            }
            cin.get();

niestety ta część kodu nie działa jak należy, ponieważ "plikwy << line;" nie zapisuje wcześniej wyciągniętych wierszy z pliku. Jak zastąpię zmienna "line" jakimś dowolnym wyrazem, to ten wyraz zostanie zapisany do pliku csv, natomiast zmienna nie :(

0

Tak, ponieważ w pętli while( getline( inputfile, line ) ) stale nadpisujesz tę zmienną line - musiałbyś zrobić tak:

/* ... */

string foundLine;

/* ... */

while (getline(...)) {
  if (/* ... */) {
    foundLine = line;
  }
}

/* ... */

plikwy << foundLine;

/* ... */

Ewentualnie możesz otwierać plikwy na początku (przed pętlą while) i podejść do tego prościej:

while (getline(...)) {
  if (/* ... */) {
    plikwy << line;
  }
}
0

Dziękuję za pomoc :)

Zrobiłem w ten sposób i zapisuje mi do pliku CSV, ale tylko szukane słowo, a idea programiku polega na tym, aby zapisało cały wynik, który wyświetla w konsoli ;)

0

Zatem pokaż jak zrobiłeś ;-)

0
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

fstream plikwy;

int main()
{
    char saveFile[256];
    char FileName[256];
    char SearchWord[256];
    char tmp[1024];
    string line;
    string foundLine;

    cout << "Podaj aktualną datę np. [2018/01 ";
    cin >> SearchWord;
    cout << "\n\n";
    cout << "Nazwa pliku do przeszukania: ";
    cin >> FileName;
    //std::ifstream file(FileName);
    //std::string line1;

    ifstream FileSearch(FileName);
    ifstream inputfile;

    size_t pos;
    inputfile.open(FileName, ios::in);
    if (inputfile.is_open())
{
    while(!FileSearch.eof())
    {
        while(getline(inputfile,line))
            {
             pos = line.find(SearchWord);
              if(pos!=string::npos) // string::npos is returned if string is not found
                {
                    foundLine = line;
                cout << line << "\n";

                }
            }
                        cout << "Podaj nazwe pliku do ktorego zapisac\n";
                        cin >> saveFile;
                        ofstream plikout(saveFile);

                        plikwy.open(saveFile, ios::out);
                        if(plikwy.good())
                        {
                            plikwy << foundLine;
                            plikwy.close();
                        }
                        cin.get();
    break;
    }
}

system("PAUSE");

    return 0;
}

O tak :) jak jest błąd to przepraszam :)

0
  1. Wrzucaj kod w tagi kolorujące składnię.

  2. Nie zapominaj o prawidłowym formatowaniu kodu.

  3. ofstream plikout( saveFile ); - po co to?

  4. Na moje oko kod wygląda poprawnie - z tym mankamentem, że Twój kod zapisze do pliku jedynie ostatnie wystąpienie danego ciągu (ponieważ w kółko ten plik otwierasz i zamykasz, nadpisując jego poprzednią zawartość).

0
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;



int main()
{
    char saveFile[256];
    char FileName[256];
    char SearchWord[256];
    char tmp[1024];
    string line;
    string foundLine;

    cout << "Podaj aktualną datę np. [2018/01 ";
    cin >> SearchWord;
    cout << "\n\n";
    cout << "Nazwa pliku do przeszukania: ";
    cin >> FileName;
    cout << "Podaj nazwe pliku do ktorego zapisac\n";
    cin >> saveFile;
    //std::ifstream file(FileName);
    //std::string line1;

            ifstream FileSearch(FileName);
            ifstream inputfile;
            ofstream plikwy(saveFile);
            ofstream plikout;

                               // plikwy.open(saveFile, ios::out);
                                //fstream plikwy;



    size_t pos;
    inputfile.open(FileName, ios::in);
    plikout.open(saveFile, ios::out);
    if (inputfile.is_open() && plikout.is_open())
{
    while(!FileSearch.eof())
    {
        while(getline(inputfile,line))
            {
             pos = line.find(SearchWord);
              if(pos!=string::npos) // string::npos is returned if string is not found
                {
                    foundLine = line;
                cout << line << "\n";

                }
            }
                                if(plikout.good())
                                {
                                    plikout << foundLine;
                                    plikout.close();
                                }
                                cin.get();

    break;
    }
}

system("PAUSE");

    return 0;
}

Więc zrobiłem następująco, i dalej zapisuje ostatną frazę, być może jest to mały widoczny błąd, lecz ja niestety nie wiem co dalej zrobić

0

Poprawione :)

#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
  char saveFile[256];
  char FileName[256];
  char SearchWord[256];
  char tmp[1024];
  string line;
  string foundLine;

  cout << "Podaj aktualną datę np. [2018/01 ";
  cin >> SearchWord;
  cout << "\n\n";
  cout << "Nazwa pliku do przeszukania: ";
  cin >> FileName;
  cout << "Podaj nazwe pliku do ktorego zapisac\n";
  cin >> saveFile;
  // std::ifstream file(FileName);
  // std::string line1;

  ifstream FileSearch(FileName);
  ifstream inputfile;
  ofstream plikwy(saveFile);
  ofstream plikout;

  // plikwy.open(saveFile, ios::out);
  // fstream plikwy;

  size_t pos;
  inputfile.open(FileName, ios::in);
  plikout.open(saveFile, ios::out);
  if (inputfile.is_open() && plikout.is_open()) {
    while (!FileSearch.eof()) {
      while (getline(inputfile, line)) {
        pos = line.find(SearchWord);
        if (pos !=
            string::npos)  // string::npos is returned if string is not found
        {
          foundLine = line;
          cout << line << "\n";
        }
      }
      if (plikout.good()) {
        plikout << foundLine;
        plikout.close();
      }
      cin.get();

      break;
    }
  }

  system("PAUSE");

  return 0;
}

0

Fundamentalne pytanie: chcesz zapisać jedno wystąpienie czy wszystkie?

0

Wszystkie :)

1

Zatem nie rób foundLine = line;, tylko wrzuć tam plikout << line; i załatwione.

0

Działa :):)
Dziękuję bardzo :)

Idąc dalej, jest możliwość aby wynik konsoli:
[2018/01/23 0911.808240, 2] passdb/pdb_ldap.c:553(init_sam_from_ldap)
[2018/01/23 0911.809135, 2] passdb/pdb_ldap.c:2427(init_group_from_ldap)
[2018/01/23 0911.810550, 2] smbd/close.c:691(close_normal_file)
[2018/01/23 0911.817392, 2] smbd/open.c:704(open_file)
[2018/01/23 0911.818263, 2] passdb/pdb_ldap.c:553(init_sam_from_ldap)
[2018/01/23 0911.819325, 2] passdb/pdb_ldap.c:2427(init_group_from_ldap)
[2018/01/23 0911.827431, 2] smbd/close.c:691(close_normal_file)
[2018/01/23 0911.828950, 2] smbd/open.c:704(open_file)
[2018/01/23 0911.829847, 2] passdb/pdb_ldap.c:553(init_sam_from_ldap)
[2018/01/23 0911.830989, 2] passdb/pdb_ldap.c:2427(init_group_from_ldap)
[2018/01/23 0911.847923, 2] smbd/close.c:691(close_normal_file)
[2018/01/23 0911.855651, 2] smbd/open.c:704(open_file)
[2018/01/23 0911.856629, 2] passdb/pdb_ldap.c:553(init_sam_from_ldap)
[2018/01/23 0911.857472, 2] passdb/pdb_ldap.c:2427(init_group_from_ldap)
[2018/01/23 0911.865573, 2] smbd/close.c:691(close_normal_file)
[2018/01/23 0911.867079, 2] smbd/open.c:704(open_file)
[2018/01/23 0911.867923, 2] passdb/pdb_ldap.c:553(init_sam_from_ldap)
[2018/01/23 0911.868780, 2] passdb/pdb_ldap.c:2427(init_group_from_ldap)
[2018/01/23 0911.871405, 2] smbd/close.c:691(close_normal_file)
[2018/01/23 0911.878218, 2] smbd/open.c:704(open_file)
[2018/01/23 0911.879108, 2] passdb/pdb_ldap.c:553(init_sam_from_ldap)
[2018/01/23 0911.880098, 2] passdb/pdb_ldap.c:2427(init_group_from_ldap)
[2018/01/23 0911.888160, 2] smbd/close.c:691(close_normal_file)

Wyświetlić tylko pierwszy i ostatni wiersz z każdego dnia?

0

Możesz je np. zapisywać do vectora i wyświetlać tylko pierwszą i ostatną wartość z niego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1