Proste operacje na plikach tekstowych

0

Witam, jak mogę sprawdzić czy plik istnieje, odczytać dane z pliku, dopisać dane do pliku oraz utworzyć nowy plik, próbowałem użyć biblioteki fstream ale to nie zadziałało.

1

próbowałem użyć biblioteki fstream ale to nie zadziałało.

Pokaż jak próbowałeś.

2

std::filesystem::exists (lub, przed C++17, API OS), resztę obsłużysz za pomocą fstream

0

@several: Napisałem takie coś

fstream plik;
plik.open("dane.txt", ios::in);
AnsiString linia;

while( !plik.eof() )
{
  getline(plik, linia);
}
plik.close();
2

getline działa tylko i wyłącznie z std::string.
Da się konwertować pomiędzy AnsiString a std::string, z tym że radze te konwersje zminimalizować.

5

Ja jeszcze doradzę, że takie podejście — „sprawdzić czy plik istnieje, odczytać dane z pliku” w większych, poważniejszych programach być używane nie powinno. Zbyt wiele rzeczy się może stać pomiędzy sprawdzeniem a odczytem. Bezpieczniej, co do zasady, próbować „na pałę” i reagować odpowiednio na błędy, niż trzymać kciuki, że jeśli plik istniał tę instrukcję temu, to dalej istnieje.

0

Ostatnio pakowałem kilka bmp do jednego pliku z zasobami i

//#include<stdio.h>
int znaczek;
FILE *plik=fopen("obraz.bmp","rb");  //plik źródłowy
FILE *pliczek=fopen("plik_wynikowy.bmp","wb"); //plik wyjściowy
while(!feof(plik)){
znaczek=fgetc(plik);    
fputc(znaczek,pliczek);
rozmiar++;}
fclose(plik);
fclose(pliczek);

da radę i bez "znaczek" i bez "rozmiar", wszystko zależy od planu.

zrobiło robotę, rozmiar każdego zgadzał się co do bitu, rozmiar wszystkich był sumą rozmiarów.
No dało radę.
getline'ami bym się zajechał. Chyba.
Jak ktoś

1

Skoro kolega korzysta z typu AnsiString, to chyba chodzi o C++ Buildera, który ma własne, proste metody, zwłaszcza do współpracy z plikami tekstowymi. Zawsze można użyć wewnątrz: LoadFromFile(),SaveToFile(),WriteToFile(),FileOpen(),FileWrite(), jest tego naprawdę dużo w tym środowisku.

1
johnny_Be_good napisał(a):

No dało radę.
getline'ami bym się zajechał. Chyba.
Jak ktoś

Nie getlinami byś się zajechał, tylko byś się zajechał użyciem rodziny tekstowej funkcji do pliku co do swojego sensu binarnego.
Przyjdzie takie połączenie okoliczności, że to skopie tylną część ciała. W doraznych przypadkowych okolicznoscia mogło "dać radę" , ale to jest chore rozwiązanie, i kiedyś "nie da rady"

(pominę inne oczywiste dla każdego oprócz ciebie argumenty na "nie")

Cóż, Szanowny Apostole C, w C też się sprawdza: krowa, która dużo ryczy ...

0
davout napisał(a):

Skoro kolega korzysta z typu - AnsiString, to chyba chodzi o C++ Buildera, który ma własne, proste metody, zwłaszcza do współpracy z plikami tekstowymi. Zawsze można użyć wewnątrz: LoadFromFile(),SaveToFile(),WriteToFile(),FileOpen(),FileWrite(), jest tego naprawdę dużo w tym środowisku.

Pytanie, co zostanie człowieka który będzie się edukował w dialekcie a nie w języku oryginalnym. MOIM ZDANIEM (nie każdy mus się zgodzić) zrobi sobei krzywdę
To jak uczenie sie angielskiego w którymś z amerykańskich ChinaTown. Niby się da ...

1
Filip123456 napisał(a):

@several: Napisałem takie coś

fstream plik;
plik.open("dane.txt", ios::in);
AnsiString linia;

while( !plik.eof() )
{
  getline(plik, linia);
}
plik.close();

Bardziej sensownie:

void processLinesOf(std::istream& in, std::function<void(std::string)> callback)
{
    std::string line;
    while (getline(in, line)) {
        callback(line);
    }
}

void processLinesOf(const std::string& fileName, std::function<void(std::string)> callback)
{
    std::ifstream f{fileName};
    if (f) {
        processLinesOf(f, move(callback));
    } else {
        std::perror(fileName.c_str()); // wypisze opis błedu otwarcia pliku do stderr
    }
}


void processLinesOf(const std::string& fileName, std::function<void(system::AnsiString)> callback)
{
    processFile(
      file, 
      [callback= move(callback)](const std::string& s) 
      {
        callback(system::AnsiString(s.c_str())); 
      });
}

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