Отсортировать текст из файла построчно по 50 элементов в строке. Разбить на блоки и вывести их в несколько рядов
Необработанное исключение: System.ArgumentOutOfRangeException: Индекс и показание счетчика должны указывать на позицию в строке. Жалуется на 65 строку кода. А конкретнее на строку:
FinalTxt = FinalTxt.Remove(((countStrPage * length) * (countPage - 1));
Суть в том, что мне нужно сначала отсортировать текст построчно. По 50 элементов в строке. Это есть. А потом разбить текст на блоки и вывести их в несколько рядов.
В моем файле 2000 элементов ровно. По-этому брал значения countPage = 4 , countStrPage = 10.
Если вам не нравится мой ход мыслей по поводу такого разложения блоков, предложите свой
{
Console.WriteLine("Укажите количество страниц в вашей книге");
int countPage = int.Parse(Console.ReadLine());
Console.WriteLine("Укажите количетсво строк в странице");
int countStrPage = int.Parse(Console.ReadLine());
string text = File.ReadAllText(@"C:\lab5.txt");
Console.WriteLine();
Console.WriteLine();
string finalTxt = "";
int length = 50; //Количетсво символов в строке
int n = 1; //для переноса строки
string[] blocks = new string[countPage];
// Сначало разобьем текст на строки
for (int i = 0; i < text.Length; i++)
{
if (i == length * n)
{
n += 1;
finalTxt += "\r\n";
finalTxt += text[i];
}
else
{
finalTxt += text[i];
}
}
//Теперь разобьем его на блоки
for (int i = countPage - 1; i > -1; i--)
{
// Количество элемнтов на одной странице countStrPage * length ( кол-во строк на длину ) это будет один блок.
if (i == 0)
{
blocks[i] = finalTxt;
break;
}
blocks[i] = finalTxt.Substring((countStrPage * length) * (countPage - 1));
finalTxt = finalTxt.Remove(((countStrPage * length) * (countPage - 1)), ((countStrPage * length) * countPage));
countPage -= 1;
}
for (int i = 0; i < countPage; i++)
{
Console.WriteLine(blocks[i] + "\t");
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Кажется получилось, с использованием StringBuilder как накопителя текста для страницы.
static void Main(string[] args)
{
Console.Write("Укажите количество страниц в вашем тексте: ");
int countPage = int.Parse(Console.ReadLine());
Console.Write("Укажите количетсво строк в странице: ");
int countStrPage = int.Parse(Console.ReadLine());
//string text = File.ReadAllText(@"C:\lab5.txt");
//Так как файла с данными у меня нет, я использую генератор случайных букв.
//Удалите следующие 5 строк и раскомментируйте чтение из файла у себя.
char[] chars = new char[2000];
Random rnd = new Random();
for (int i = 0; i < chars.Length; i++)
chars[i] = (char)rnd.Next('a', 'z' + 1);
string text = new string(chars);
int length = 50; // длина строки
int j = 0; // счетчик страниц
string[] blocks = new string[countPage];
StringBuilder sb = new StringBuilder();
for (int i = 0; i < text.Length; i++)
{
sb.Append(text[i]);
if ((i + 1) % length == 0) // если конец строки
{
if ((i + 1) / length % countStrPage == 0) // если конец страницы
{
blocks[j] = sb.ToString();
sb.Clear();
j++;
if (j == countPage) // если все страницы заполнены, выход из цикла, на случай если входных данных больше, чем нужно
break;
}
else
sb.AppendLine();
}
}
int blocksPerLine = Console.BufferWidth / (length + 1);
int cursorTop = Console.CursorTop;
for (int i = 0; i < j; i++)
{
int cursorLeft = i % blocksPerLine * (length + 1);
if (cursorLeft == 0)
{
Console.WriteLine();
cursorTop = Console.CursorTop;
}
else
Console.CursorTop = cursorTop;
string[] lines = blocks[i].Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines)
{
Console.CursorLeft = cursorLeft;
Console.WriteLine(line);
}
}
Console.ReadKey();
}
Вывод в консоль
Укажите количество страниц в вашем тексте: 4
Укажите количетсво строк в странице: 10
sxkttdbkmfbgakbobhqaheipuhxfsvyffmmeyirnlohompdgvh zwzibtxymzayzrarbxdajdxesdzdtvwiemkzefxkkxnczntcsg
tlertopvylgwrrhwaoxwqsqcoswucfeqjlbmaosxpcjghpwqgq unmyrwzvpyuufrcsunganwasqlpuefjxlmaivfvnzipyqqsvzh
pojzrbvccasvsthpmgpuvlvzhnijuzwfnmqphkuarxmsftkqys tgvrtynuifgeqjoxisrtwossaegbbasuvxmdbttbvbwpgvsgkt
cqaludsjrdtlhcemifdrhblpcxzduncrlcxffbsmwytqhgqjot hzefkeocrormsimmjtxlvpzpyvrcmfmaristppmioycekiioct
lengkbfkiweppebbzffzggnqviiviwhqpabyeervausvihjopf lziyxrzogpmlqlbqvkptwtgowxnvfqmdastnrskbtbjxvdiqct
gkdpmfrxlbsjcmonzocdxvnjymnrhnztfdpxmanwggspdqsghu nyyiwssucaeeiqdilyroycaoavkistowsmcnervbuxqjwossun
hummhkxtqzrzqxcyezwrbzafwqdxgiugkmgehtvezsknehqvne rkyoukykibhjbjlhmwopeucptamqrldsofbeydrrpuiuukwgxp
mtjpthugprhznhflpdrxrkdsripmbpzikbvbxusykaddwafcit cveejxhivtyhsxypvvhgjifwzjliviefscihnkwdxpixtibkve
smdpncprylshfarzollenulsnqgzvqcmehxnevotmgwhgdudmx pbyqguphfzlznmpsoqpqblyejuzidriamrscgbvnrgexrycvib
muqegxblbwvpvhifdydevtwrrhxdmkwdnyeiwzbzlstsywkpza tkvfcecuhmuhenqkmvumlmubzvgbmlrezcxxfhooamujtjbrgg
lgbvpgptghyaiwuqhcptffhgmyslipupvfzldemqhlagpadypd uwkktwoylygluzdeaftfvtznwmzxhfltgdignylskojpbvrjqw
bzbmbfyujqoelqnjecwimdqzlteaqmvuvfnvoietnivvcdaktg kvwhkaxwogwrrgmnerqxqcuauhkjmauqhkuqwzsijqkewtwddo
vbbgqyibbhaxexvuifdsuvycvdivxhsuhkqtspppmmhwtpexzh qassgiavmdqnknmgjhlwqfyiozspebkhgxjtyoelpbmosvgwsp
uvgblzcylmpnetogqtgbctqnfiocjgykvpmxngyrrueczyhnhm jprhylcjegqkrltihmdshvdagpsjqstvxorupyzxrojxvejbvj
zkrxfbetvckzoeofrphrsjvpkipoohbbvwgotyklsulvgrfzot ntsziomrajtstlmvndtytjnfbtlfebfqogfacygdiyxqezuyla
hsgquppcnxmqfobiesyzmtfvyxyziscpauzjvfbqyqlmycpxuy rghxqefnyocgmzdddnglsowqpvlxbbznuejzjrqbuparaclymb
nmaohnnkrxrqtuuwqkosnzqhbviswwhbfkfpommlvlnezhxqsb vhszhdjqhusilwppmipeumwerdoeqnkmkafruuwgpsjvimddck
leibkowtmlfunvpqljpehexcwcllhtyrzvkcsdzrtvzbgbxroj pdjihjknieoeaukgxlqxusliobdavfzkcfxgdctwhhmsrkrolc
wnbnthggeicklsnovslmyhjylmewwvetwywkplbdvlyqoijgnr osnfqxrbtffjrdfecvwdcvrtqnftqekoptrgxwpzpcjoqxpjmn
ffgckpedchckkjeionvcyjrhqmisjcdyjepynunhgmjualbpmg hwshzsatocrykovruylyhggxoamddtywgdwnwitygdhmiqrusz