Sprawdzanie wielkości poszczególnych linii pliku tekstowego

0

Witam.

Muszę przygotować plik tekstowy którego głównym wymaganiem jest to aby każdy wiersz zajmował dokładnie 683 bajty (681 znaków + CRLF)
Niestety w danych które mam do przetworzenia poza polskimi znakami (które załatwiłem sobie makrem) trafiają się różne dziwne znaczki (+znaki nowej linii), przez które wspomniane 681 znaków nie zajmuje wcale 681 bajtów.

  • no i tutaj pytanie do Was : macie pomysł jak najszybciej wyłapać wiersze które zajmują za dużo ?
0

Otwórz plik binarnie, ładuj porcje danych z pliku do bufora i ręcznie rozdzielaj linie na podstawie sekwencji CRLF; Innej możliwości nie widzę, bo skoro wewnątrz linii znajdować się mogą pojedyncze znaki LF, to odczyt danych stricte jako pliku tekstowego może przysporzyć problemy;

Jeśli miałbyś użyć do tego celu Lazarusa, to polecam zagłębić się w implementację metody TStringList.LoadFromFile - tam właśnie w ten sposób dzielone są dane na linie i pakowane do buforów; Ale tagi widzę puste, więc ewentualnie podaj więcej informacji.

0

Ewentualnie użyj np. Base64. Kodujesz same dane i generujesz plik:

dane 681 [B] + CRLF
...
dane 681 [B] + CRLF

Wygląda tak jak oczekujesz, czytasz bez problemu.

0

to zalezne jest od kodowania. Wiec jakie kodowanie moze miec plik?
Czy mozesz zmienic kodowanie?
Czy mozesz sprawdzic kodowanie pliku (w sensie czy nie jest zabronione przez polecenie)?

0

Przecież to jest programik na parę linijek:

int main() {
    const FixedLineSize = 681;

    string line;
    while (getline(cin, line)) {
          line.resize(FixedLineSize, ' ');
          cout << line << endl;
    }
    return 0;
}

Fail może być jeśli jest użyte kodowanie, które ma znaki wielobajtowe.
Napisałeś o polskich znakach, ale nie napisałeś jakie kodowanie ma mieć ten plik.

Wersja z zawijaniem wierszy:

int main() {
    const FixedLineSize = 681;

    string line;
    while (getline(cin, line)) {
          while (line.size()>FixedLineSize) {
                cout << string(line, 0, FixedLineSize) << endl;
                line.erase(0, FixedLineSize);
          }
          line.resize(FixedLineSize, ' ');
          cout << line << endl;
    }
    return 0;
}

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