Всем добрый день.
Программа не проходит проверку по 3 и 4 пункту, хотя обновление и удаление строки работает.
Прошу помочь найти вариант запуска программы, при котором она сработает неправильно, а уж исправлю я сам.
Понятно, что в коде без пол-литра никто не разберется. поэтому найти ошибку в коде не прошу.
Заранее спасибо.
package com.javarush.task.task18.task1828;
/*
Прайсы 2
*/
import java.io.*;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s, str = null, old = null;
s = reader.readLine();
FileInputStream fi = null;
try{
fi = new FileInputStream(s);
BufferedReader br = new BufferedReader(new InputStreamReader(fi));
}catch(FileNotFoundException e){}
FileOutputStream fo = null;
byte b[] = new byte[1000];//основной массив файла
byte ww[] = new byte[1000];//рабочий массив для копирования части файла при сдвиге данных
boolean end_all = false;
int len = 0, nlen = 0;
int ff = 0;
int cc = 0;
int start = 0, end = 0, nstart = 0, nend = 0;
while (fi.available() > 0) {
fi.read(b);
if (!end_all) {
int ij = b.length - 1;
int minus_one = 0;
while (b[ij] == 0) {//заполняем массив заведомо неиспользуемыми символами
b[ij] = -2;
ij--;
minus_one = ij;
}
int k = 0;
int end1 = 0;
byte c[] = new byte[8];//id
byte pr1[];//productName
byte pr2[];//price
byte pr3[];//quantity
try {
if (args[0].length() > 0) {
if (args[0].equals("-u")) { //update
if (args[1].length() > 0 && args[2].length() > 0 && args[3].length() > 0 && args[4].length() > 0) {
while (args[1].length() < 8) {
args[1] = args[1] + " ";
}
c = args[1].getBytes();
for (int y = 0; y < b.length; y++) {
if (!end_all) {
if (y == 0 || b[y - 1] == 10) {//смотрим всегда id-шник
for (int jk = y; jk < (y + 8); jk++) {
if (b[jk] == c[k]) {
k++;
if (k == args[1].length() && args[1].length() == 8) {
start = y + 8;//откуда начинаем работать в строке
pr1 = args[2].getBytes();//копируем productName
byte prName[] = new byte[30];
for (int yy = 0; yy < prName.length; yy++) {//в prName либо данные, либо 0
if (yy < pr1.length) prName[yy] = pr1[yy];
else prName[yy] = 32;
}
int uend = 0;
int u = 0;
uend = start + prName.length;//конец поля productName
for (int i = start; i < uend; i++) {//копируем в основной массив
if (u < prName.length) {
b[i] = prName[u];
u++;
}
}
u = 0;
pr2 = args[3].getBytes();
byte price[] = new byte[8];
for (int yy = 0; yy < price.length; yy++) {
if (yy < pr2.length) price[yy] = pr2[yy];
else price[yy] = 32;
}
start = uend;
uend = start + price.length;
for (int i = start; i < uend; i++) {
if (u < price.length) {
b[i] = price[u];
u++;
}
}
u = 0;
pr3 = args[4].getBytes();
int oend = 0;
byte quantity[] = new byte[4];
for (int yy = 0; yy < quantity.length; yy++) {
if (yy < pr3.length) quantity[yy] = pr3[yy];
else quantity[yy] = 32;
}
start = uend;
uend = start + quantity.length;
for (int i = start; i < minus_one; i++) {
if (b[i] == 13) {
oend = i;
break;
}
}
int leng = oend - start;
///////////////////////////////
int nn = 0, n = 0, w = 0;//когда изменяемая строка больше строки в файле
if (b[uend] != -2) {//копирование части файла
if (leng < pr3.length) {
nn = uend - oend;//если новое количество длин старого насколько надо сдвинуть
}
n = oend;//с какого символа сдвигать
for (int e = n; e <= minus_one; e++) {//копируем в рабочий массив
if (w <= minus_one) {
ww[w] = b[e];
w++;
}
}
}
////////////////////////////////
for (int i = start; i < uend; i++) {
if (u < quantity.length) {
b[i] = quantity[u];
u++;
}
}
int jj = 0;
if (b[uend] != -2 && w != 0) {//добавляем перенос строки, если не конец файла
jj = uend;
minus_one = minus_one + nn;
int t = 0;
for (int g = jj; g <= minus_one; g++) {//возвращаем остаток файла из рабочего массива в основной
b[g] = ww[t];
t++;
}
}
if (w == 0 && minus_one != uend) minus_one = uend;
fo = new FileOutputStream(s);
for (int ii = 0; ii <= minus_one; ii++) {
if (b[ii] != -2) fo.write(b[ii]);
}
fo.close();
end_all = true;
}
} else k = 0;
}
}
} else break;
}
}
} else if (args[0].equals("-d")) {//delete
if (args[1].length() > 0 && args.length == 2) {
while (args[1].length() < 8) {
args[1] = args[1] + " ";
}
c = args[1].getBytes();
for (int y = 0; y < b.length; y++) {
if (!end_all) {
if (y == 0 || b[y - 1] == 10) {//смотрим всегда id-шник
for (int jk = y; jk < (y + 8); jk++) {
if (b[jk] == c[k]) {
k++;
if (k == args[1].length() && args[1].length() == 8) {
start = y;
for (int ll = start; ll < b.length; ll++) {
if (b[ll] == 13 || b[ll] == -2) {
end = ll;
break;
} else if (ll == (b.length - 1)) end = b.length;
}
if ((end + 1) == b.length) {
end = b.length;
len = b.length;
}
if (b[end] == -2 && start != 0) {//последняя строка
end1 = end;
b[start - 2] = -2;
b[start - 1] = -2;
} else if (end != b.length && start == 0)
end1 = end + 2;//первая строка
else if (end == b.length && start == 0)
end1 = end;//единственная строка в файле
else {
end1 = end + 2;
}//строка посередине
for (int u = start; u < end1; u++) {
b[u] = -2;
}
fo = new FileOutputStream(s);
for (int ii = 0; ii < b.length; ii++) {
if (b[ii] != -2)
fo.write(b[ii]);
}
fo.close();
end_all = true;
}
} else k = 0;
}
}
} else break;
}
}
}
}
}catch(ArrayIndexOutOfBoundsException e){}
}
}
fi.close();
reader.close();
}
}package com.javarush.task.task18.task1828;
/*
Прайсы 2
*/
import java.io.*;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s, str = null, old = null;
s = reader.readLine();
FileInputStream fi = null;
try{
fi = new FileInputStream(s);
BufferedReader br = new BufferedReader(new InputStreamReader(fi));
}catch(FileNotFoundException e){}
FileOutputStream fo = null;
byte b[] = new byte[1000];//основной массив файла
byte ww[] = new byte[1000];//рабочий массив для копирования части файла при сдвиге данных
boolean end_all = false;
int len = 0, nlen = 0;
int ff = 0;
int cc = 0;
int start = 0, end = 0, nstart = 0, nend = 0;
while (fi.available() > 0) {
fi.read(b);
if (!end_all) {
int ij = b.length - 1;
int minus_one = 0;
while (b[ij] == 0) {//заполняем массив заведомо неиспользуемыми символами
b[ij] = -2;
ij--;
minus_one = ij;
}
int k = 0;
int end1 = 0;
byte c[] = new byte[8];//id
byte pr1[];//productName
byte pr2[];//price
byte pr3[];//quantity
try {
if (args[0].length() > 0) {
if (args[0].equals("-u")) { //update
if (args[1].length() > 0 && args[2].length() > 0 && args[3].length() > 0 && args[4].length() > 0) {
while (args[1].length() < 8) {
args[1] = args[1] + " ";
}
c = args[1].getBytes();
for (int y = 0; y < b.length; y++) {
if (!end_all) {
if (y == 0 || b[y - 1] == 10) {//смотрим всегда id-шник
for (int jk = y; jk < (y + 8); jk++) {
if (b[jk] == c[k]) {
k++;
if (k == args[1].length() && args[1].length() == 8) {
start = y + 8;//откуда начинаем работать в строке
pr1 = args[2].getBytes();//копируем productName
byte prName[] = new byte[30];
for (int yy = 0; yy < prName.length; yy++) {//в prName либо данные, либо 0
if (yy < pr1.length) prName[yy] = pr1[yy];
else prName[yy] = 32;
}
int uend = 0;
int u = 0;
uend = start + prName.length;//конец поля productName
for (int i = start; i < uend; i++) {//копируем в основной массив
if (u < prName.length) {
b[i] = prName[u];
u++;
}
}
u = 0;
pr2 = args[3].getBytes();
byte price[] = new byte[8];
for (int yy = 0; yy < price.length; yy++) {
if (yy < pr2.length) price[yy] = pr2[yy];
else price[yy] = 32;
}
start = uend;
uend = start + price.length;
for (int i = start; i < uend; i++) {
if (u < price.length) {
b[i] = price[u];
u++;
}
}
u = 0;
pr3 = args[4].getBytes();
int oend = 0;
byte quantity[] = new byte[4];
for (int yy = 0; yy < quantity.length; yy++) {
if (yy < pr3.length) quantity[yy] = pr3[yy];
else quantity[yy] = 32;
}
start = uend;
//if (pr3.length > 4) {
uend = start + quantity.length;
//} else uend = start + pr3.length;
for (int i = start; i < minus_one; i++) {
if (b[i] == 13) {
oend = i;
break;
}
}
int leng = oend - start;
///////////////////////////////
int nn = 0, n = 0, w = 0;//когда изменяемая строка больше строки в файле
if (b[uend] != -2) {//копирование части файла
if (leng < pr3.length) {
nn = uend - oend;//если новое количество длин старого насколько надо сдвинуть
}
n = oend;//с какого символа сдвигать
for (int e = n; e <= minus_one; e++) {//копируем в рабочий массив
if (w <= minus_one) {
ww[w] = b[e];
w++;
}
}
}
////////////////////////////////
for (int i = start; i < uend; i++) {
if (u < quantity.length) {
//if (quantity[u] != 0) {
b[i] = quantity[u];
u++;
//}
}
}
int jj = 0;
if (b[uend] != -2 && w != 0) {//добавляем перенос строки, если не конец файла
jj = uend;
minus_one = minus_one + nn;
int t = 0;
for (int g = jj; g <= minus_one; g++) {//возвращаем остаток файла из рабочего массива в основной
b[g] = ww[t];
t++;
}
}
if (w == 0 && minus_one != uend) minus_one = uend;
/*for (int yy = minus_one; yy >= (minus_one - 3); yy--) {
if (b[yy] == 0) {//убираем лишние нули
b[yy] = -2;
}
}*/
/*for (int h = 0; h <= minus_one; h++) {
if (b[h] == -2 && b[h + 1] != -2) {
b[h] = 0;
}
}*/
fo = new FileOutputStream(s);
for (int ii = 0; ii <= minus_one; ii++) {
if (b[ii] != -2) fo.write(b[ii]);
}
fo.close();
end_all = true;
}
} else k = 0;
}
}
} else break;
}
}
} else if (args[0].equals("-d")) {//delete
if (args[1].length() > 0 && args.length == 2) {
while (args[1].length() < 8) {
args[1] = args[1] + " ";
}
c = args[1].getBytes();
for (int y = 0; y < b.length; y++) {
if (!end_all) {
if (y == 0 || b[y - 1] == 10) {//смотрим всегда id-шник
for (int jk = y; jk < (y + 8); jk++) {
if (b[jk] == c[k]) {
k++;
if (k == args[1].length() && args[1].length() == 8) {
start = y;
for (int ll = start; ll < b.length; ll++) {
if (b[ll] == 13 || b[ll] == -2) {
end = ll;
break;
} else if (ll == (b.length - 1)) end = b.length;
}
if ((end + 1) == b.length) {
end = b.length;
len = b.length;
}
if (b[end] == -2 && start != 0) {//последняя строка
end1 = end;
b[start - 2] = -2;
b[start - 1] = -2;
} else if (end != b.length && start == 0)
end1 = end + 2;//первая строка
else if (end == b.length && start == 0)
end1 = end;//единственная строка в файле
else {
end1 = end + 2;
}//строка посередине
for (int u = start; u < end1; u++) {
b[u] = -2;
}
fo = new FileOutputStream(s);
for (int ii = 0; ii < b.length; ii++) {
if (b[ii] != -2)
fo.write(b[ii]);
}
fo.close();
end_all = true;
}
} else k = 0;
}
}
} else break;
}
}
}
}
}catch(ArrayIndexOutOfBoundsException e){}
}
}
fi.close();
reader.close();
}
}