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