Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím, potřeboval bych menší pomoc. Program by měl po zadaném počtu znaků zalámovat text, nemůžu text zalomit ve slovu tzn. že to musím zalomit v mezeře.
#include "stdafx.h" #include <iostream> using namespace std; int get_lines(FILE *fr); int main() { FILE *fr, *fw, *fr_g; char c; int i = 1, n = 30, num_rows; /* printf("\nZadejte pocet znaku na radku: "); scanf("%d",&n);*/ fr_g = fopen("C:/Lorem.txt", "r"); fr = fopen("C:/Lorem.txt", "r"); fw = fopen("C:/Lorem_NEW.txt", "w"); num_rows = get_lines(fr_g); fclose(fr_g); cout << "Pocet radku ve vstupnim souboru: " << num_rows << endl; for (int j = 1; j <= num_rows; j++) { fprintf(fw," "); while ((c = getc(fr)) != '\n') { if (((i >= (n-10)) && (i <= 31)) && (c == ' ')) { fprintf(fw,"\n"); i = 1; } else { fprintf(fw,"%c",c); i++; } } fprintf(fw,"\n"); i = 0; } fclose(fr); fclose(fw); cout << endl << endl; system("pause"); return 0; } int get_lines(FILE *fr) { char c; int num_rows = 0; while ((c = getc(fr)) != EOF) { if (c == '\n') { num_rows++; } } return num_rows; }
problémem je, že napříkald když máme text zalomit po max 30 znacích, tzn. mezi 20 a 30 znakma budu hledat mezeru, tak mi najde první mezeru po 20 a další nebere v potaz. Potřeboval bych to nějak vylepšit tak, aby bral tu poslední mezeru která bude k dispozici v intervalu mezi 20-30.
Díky za pomoc
EDIT: vstupní soubor je strukturovaný jako 1 řádek = ve výstupním souboru 1 odstavec
Offline
↑ StAniS:
Lze to udělat například takto. Místo toho, abys po nalezení mezery hned zalomil řádek, můžeš udělat to, že si budeš pamatovat index mezery. Projdeš řádku až do posledního znaku a poté zalomíš na takovém indexu, kde byla poslední mezera. Při tomhle řešení se budeš muset posouvat v souboru (funkce fseek).
Offline
Jestli to jeste nemas, tak tady neco je, ale nerucim za to, ze je to naprosto spravne:
#include "stdafx.h" #include <iostream> using namespace std; int get_lines(FILE *fr); int main() { FILE *fr, *fw, *fr_g; char c, Buffer[256]; int i = 0, n = 30, num_rows, LastSpace; /* printf("\nZadejte pocet znaku na radku: "); scanf("%d",&n);*/ fr_g = fopen("Input.txt", "r"); fr = fopen("Input.txt", "r"); fw = fopen("Output.txt", "w"); num_rows = get_lines(fr_g); fclose(fr_g); cout << "Pocet radku ve vstupnim souboru: " << num_rows << endl; while (!feof (fr)){ c = 0; fprintf(fw," "); while (c != '\n'){ while (i < n) { c = getc(fr); if (c == ' ') LastSpace = i; if (c == '\n' || feof (fr)) { LastSpace = i; i++; break; } Buffer [i] = c; i++; } Buffer [LastSpace] = 0; fprintf(fw,"%s\n", Buffer); if (feof (fr)) break; fseek (fr, LastSpace - i + 1, SEEK_CUR); i = 0; } } fclose(fr); fclose(fw); cout << endl << endl; system("pause"); return 0; } int get_lines(FILE *fr) { char c; int num_rows = 1; while ((c = getc(fr)) != EOF) { if (c == '\n') { num_rows++; } } return num_rows; }
Offline