Як знайти символ табуляції у рядку
Дурне питання звичайно, але я не можу його вирішити.=( Є текстовий файл з роздільниками в рядках (символ табуляції). Після табуляції стоять числа. Ага 7678890 руб
Сума ? Потрібно виловити числа і порахувати суму. Питання просте, але я не можу згадати як визначити символ табуляції та наявність пробілу (в принципі пробіл це st=" "??). А ось як бути з табуляцією?
Ще питання в принципі з того ж приводу = (
Код: Repeat якщо немає EOLN(f_old) do begin read (f_old,ch); write (f_new, ch); stf:=" "; if ch=#9 then begin while ch<" " do begin read(f_old,ch);stf:=stf+ch;end; write (f_new,stf); val(stf,m,j); setlength (a,i); a[i]:=m; inc(i); end; end; writeln(f_new); readln(f_old); Until eof(f_old); ch - змінна типу char stf - змінна типу string по першому проходу по рядку(коли знаходить число) відмінно зберігає в масиві числове значення. по другому проходу коли натикається на число відбувається помилка у виділеному рядку. Не підкажіть у чому проблема?
Жахливий код. Як оголошено f_old і f_new? Що взагалі цей код повинен зробити в процесі роботи?
Код: procedure TForm2.Button1Click(Sender: TObject); var f_old, f_new : TextFile; // f_new - test_new.txt, f_old - test.txt st,str,stf:string; a: array of Integer; i,j,m: Integer; ch: char; begin if FileExists("test_new.txt") then // якщо новий файл є - тоді видаляємо його begin AssignFile(f_new,"test_new.txt" ); Reset(f_new); CloseFile(f_new); Erase(f_new); end; // створюємо новий файл з ім'ям test_new.txt AssignFile(f_new,"test_new.txt"); AssignFile(f_old,"test.txt"); ReSet(f_old); //тільки читаємо test.txt ReWrite(f_new); //пишемо у файл test_new.txt i:=1; //обробляємо вихідний файл і результат обробки записуємо в новий файл Repeat while not EOLN(f_old) do begin read (f_old, ch); write (f_new, ch); stf:=""; if ch=#9 then begin while ch<" " do begin read(f_old,ch); stf:=stf+ch; end; write (f_new,stf); val(stf,m,j); setlength (a,i); a[i]:=m; inc(i); end; end; writeln(f_new); readln(f_old); Until eof(f_old); //кінець обробки вихідного файлу CloseFile (f_old); CloseFile (f_new); Form1.Show; // показуємо вікно з результатами Form2.Hide; // ховаємо вікно з вихідним текстом end;
Потрібно порахувати суму непарних значень. Спростив на даний момент - просто порахувати суму всіх значень і відповідно вивести в новий файл (test_new.txt). їх у масив (a[i]). Все нормально по першому проходу. Після нього a[1]=23434 stf=23434. потім stf=""стає. І коли вдруге програма натрапляє на число(у разі 9) ламається на фразі stf:=stf+ch.
Ось така проблема.
function GetFileSum(FName : string) : Integer; var S : string; i : Integer; begin Result := 0; з TStringList.Create do try LoadFromFile(FName); for i := 0 to Count -1 do begin S := Strings[i]; S: Copy(S, Pos(#9, S) + 1, Length(S) - Pos(#9, S)); S := Copy(S, 1, Pos($20, S) - 1); Result := Result + StrToIntDef(S, 0); end; finally Free; end; end;
[Помилка] Proba_bank_2.pas(45): Incompatible types [Помилка] Proba_bank_2.pas(95): Undeclared identifier: "Count" [Помилка] Proba_bank_2.pas(96): Missing operator or semicolon [Помилка]Proba_bank_2.pas(16): Неможливий для того, щоб повідомити або про external declaration: "TForm2.GetFileSum" [Фатальна помилка] Proba_bank_prj.dpr(6): Використовувати не можна за допомогою програми "Proba_bank_2.pas"
Це ось таке видається =) Проблема в тому, що потрібно яким чином (правильним) додавати до string змінну типу char. Я по ходу роблю це неправильно! (На мій).
Крім того, потрібно виконувати ще масу операцій над числами - це не єдине що потрібно зробити. Тому треба забивати таким чином масив (просто з ним у результаті буде простіше працювати!).
Може їсти якесь інше рішення? Допоможіть!
Блін, ну що подумати зовсім ніяк? Чи F1 натиснути?
var A: array of Integer;
procedure FillArray(FName : string); var S : string; i, NumCount : Integer; begin з TStringList.Create do try LoadFromFile(FName); SetLength(A, Count); NumCount: = 0; for i := 0 to Count -1 do begin S := Strings[i]; S: Copy(S, Pos(#9, S) + 1, Length(S) - Pos(#9, S)); S := Copy(S, 1, Pos(" ", S) - 1); A[NumCount]: = StrToIntDef(S, -1); if A[NumCount] > -1 then Inc(NumCount); end; finally Free; end; end;
Код, щоправда, далеко не ідеальний, але працюватиме.
Вартість за одним видом 23434 тис руб Вартість за другим видом 938 тис руб Вартість за третім видом 23 тис руб Вартість за четвертим видом 4895 тис руб
Коли доходить до рядка Сума 26 тис рублів - readln - дихне=
procedure TForm2.Button1Click(Sender: TObject); var F_OLD, F_NEW : TextFile; // f_new - test_new.txt, f_old - test.txt st:string; a: array of Integer; i : Integer; begin AssignFile(F_NEW,"test_new.txt"); AssignFile(F_OLD,"test.txt"); ReSet(F_OLD); //тільки читаємо test.txt ReWrite(F_NEW); // пишемо файл test_new.txt i:=1; RepeatReadln(F_OLD, st);//тут дохнемо з помилкою Invalid Pointer=( St := Copy(St,Pos(#9,St)+1, Length(St)-Pos(#9,St)); St := Copy(St,1,Pos(" ",St)-1); SetLength(A, i); A[i] := StrToIntDef(St, -1); іf A[i]> ); end; Until eof(F_OLD); CloseFile(F_OLD); CloseFile(F_NEW); Form2.Hide;// ховаємо вікно з вихідним текстом .Show;// показуємо вікно з результатами end; Допоможіть ще раз опжалуйста!
>z3f А що заважає завантажити вхідний файл у StringList1 далі обробляти кожен рядок і результат писати в StringList2, по закінченні операції зберігати StringList2 у файлі.