[ C# / Java ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by procedure, 2 Nov 2008.

  1. shiku

    shiku Member

    Joined:
    6 Aug 2009
    Messages:
    0
    Likes Received:
    25
    Reputations:
    1
    Добрый день. Возникла трудность с функцией File.Move C#. Переименовываю файлы директории, но файлы, которые были выше в методе использованы для чтения и записи, не переименовываються, а создаются их копии с новыми именами. Тоесть файл якобы используется. Не могу разобраться как так выходит, потому что всегда для чтения и записи использую такую конструкцию:

    StreamReader file = new StreamReader(path);
    string text = file.ReadToEnd();
    file.Close();

    И после такого файл все равно используется и невозможно его переименовать. Подскажите, как граммотно в таком случае сделать переименование недавно использованного для чтения или записи файла?
     
    2 people like this.
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Покажи полностью код от открытия файла и до закрытия с переименовкой. Мне кажется, что ты где то преждевременно вызываешьь функцию переименования.
     
  3. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    Code:
    using(StreamReader sr = new StreamReader("file.txt))
    {
    string data = sr.ReadToEnd();
    sr.Close();
    }
    
    File.Move("file.txt","file2.txt");
    
    Должно пахать... А вообще... отладчик рулит.
     
    #1543 DeepBlue7, 4 Apr 2013
    Last edited: 4 Apr 2013
  4. dars_go

    dars_go New Member

    Joined:
    22 Sep 2007
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Приветствую. Решил попробовать написать бота для мморпг. Ранее аналогичного опыта не имел. Разобрался с получением данных из клиента.

    Вопрос такой - в какую сторону рыть для реализации отправки пакетов(эмуляцию работы клиента? каким-то образом инжект в него?). Т.е. собственно для осуществления действий в ММО. Понятно, что в каждой игрушке свои особенности, но все же приблизательный общий алгоритм.

    Есть у кого аналогичный опыт? да понимаю, задача сложная. Но вроде как руку уже набил на простом софте)
     
    #1544 dars_go, 23 Apr 2013
    Last edited: 23 Apr 2013
  5. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    dars_go, пиши прокси и пускай пакеты через бота.
     
  6. ajiuratop

    ajiuratop New Member

    Joined:
    23 Apr 2013
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Подскажите что в коде не так

    Здраствуйте подскажите получил задание по C#, из массива A удалить те элементы, которые встречаются и в массиве A и в массиве B по крайней мере по 2 раза.
    Написал как смог код, но что-то не так, когда с клавиатуры ввожу массив дальше не идет ничего.
    Буду огромно признателен, если поможете.
    namespace MyProject
    Code:
    {
     class MainClass
     {
      public static void Main (string[] args)
      {   
       int N1,N2,buff,inc1,inc2;
       bool flag=false;
       inc1=1;
       inc2=0;
       buff=0;
       Console.WriteLine("Введите размерность первого массива");   
       N1 = Convert.ToInt32(Console.ReadLine());
       Console.WriteLine("Введите размерность второго массива");
                N2 = Convert.ToInt32(Console.ReadLine());
       
       int[] x = new int[N1];        
       int[] y = new int[N2];
       
       
       Console.WriteLine("Введите первый массив");
       for (int i = 0; i < N1; i++) x[i] = Convert.ToInt32(Console.ReadLine ());
                      
       Console.WriteLine("Введите второй массив"); 
                for (int i = 0; i < N2; i++) y[i] = Convert.ToInt32(Console.ReadLine ());
                        
      
       for(int i=0;i<N1;i++)
       {
        for(int j=i+1;j<N1;j++)
        {
         if (x[i]==x[j])
         {
          buff=x[i];
          inc1++;
          flag=true;
          
           
          }
         }
        if(flag==true)
        {
         for(int l=0;l<N2;l++)
          {
           if (buff==y[l])inc2++;
         }
         if(inc2>1)
         { 
          for (int t1=0;t1<N1;t1++) { 
           if(x[t1]==buff) {
            for (int v=t1;v<N1-1;v++ )x[v]=x[v+1];
           }
          }
          
          
          for (int t1=0;t1<N2;t1++) { 
           if(y[t1]==buff) {
            for (int v=t1;v<N2-1;v++ )y[v]=y[v+1];   
          
         }
            }
       }
       }
       }
          Console.WriteLine("Первый массив");
       Console.WriteLine("Удаленно "+inc1+"элементов массива:"+ buff);
       
       for(int i =0;i<N1-inc1;i++) Console.WriteLine(x[i]);
       Console.WriteLine("Второй массив");
       Console.WriteLine("Удаленно "+inc2+"элементов массива:"+ buff);
       for(int i =0;i<N2-inc2;i++) Console.WriteLine(y[i]);
       
       
      }
      
      
     }
    }
     
    #1546 ajiuratop, 23 Apr 2013
    Last edited: 24 Apr 2013
  7. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Уточни, ты имеешь ввиду если в массиве а есть как минимум два одинаковых числа, например 4 и в массиве б есть два числа 4, то их нужно удалить?
     
  8. ajiuratop

    ajiuratop New Member

    Joined:
    23 Apr 2013
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Вот пример массив A[8]: 3 3 4 5 2 3 5 9, массив B[7]: 1 2 3 4 5 2 5. По 2 раза в обоих массивах встречается только элемент, равный 5. Массив A после удаления примет вид: A[6]: 3 3 4 2 3 9.
     
  9. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Понял, вот, только учти, что я делал под винформс, а не консоль, так что под консоль прийдётся кое где подшаманить.
    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    
    
    namespace Array_double_search
    {
        public partial class Form1 : Form
        {
            public static int[] array_1 = new int[] { 1, 3, 4, 4, 5, 2,5,7,6,4,1};
            public static int[] array_2 = new int[] { 8, 1, 4, 4, 5, 2,7,5,9,9,0};
            
            public Form1()
            {
                InitializeComponent();
                
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //Максимально число возможных повторений это кол-во элементов в массиве деленное на два
                double j = array_1.Length / 2;
                int anz = (int)Math.Round(j+1);//Округляем в большую сторону
                int[] temp_array1 = new int[anz];//Временный массив в который будут записываться повторяющиеся элементы
                int gCount = 0;//общий счётчик повторений
    
                //Прогоняем первый массив
                for (int i = 0; i < array_1.Length; i++)
                {
                    int count = 0;
                    //Проверяем наличие совпадений по всему массиву, и увеличиваем счётчик при совпадении.
                    for (int t = i + 1; i < array_1.Length - 1 && t < array_1.Length - 1 ; t++)
                    {
                        count =  array_1[i] == array_1[t] ? count + 1 : count;
                    }
    
                    //Если есть совпадения.
                    if (count > 0)
                    {
                        int tCount = 0;
                        //Прогоняем повторяющиеся элемент из первого массива по второму, и ищем минимум два совпадения во втором массиве
                        for (int secondArr = 0; secondArr < array_2.Length; secondArr++)
                        {
                            if(array_1[i] == array_2[secondArr])
                            {
                                tCount++;
                            }
                        }
                        //Находим повторяющиеся одинаковые элементы в обоих массивах и пишем во временный массив
                        temp_array1[gCount] = array_1[i];
                        gCount++;
                    }
                }
    
                
                //Выводим массив, без повторяющихся елементов
                for (int a = 0; a < array_1.Length; a++)
                   {
                    int FC = 0;
                    int SC = 0;
                    for (int c = 0; c < gCount; c++)
                      {
                     
                            FC = array_1[a] == temp_array1[c] ? FC + 1 : FC;
                            SC = array_2[a] == temp_array1[c] ? SC + 1 : SC;
                    
                        }
    //Массив 1 в Текстбокс1
                    if(FC == 0)
                    {
                    textBox1.Text += array_1[a].ToString();
                    }
    Массив 2 в Текстбокс2
                    if (SC == 0)
                    {
                        textBox2.Text += array_2[a].ToString();
                    }
                  }
               
    
            }
        }
    }
    
    
    
    ЗЫ: только для равных по кол-ву эелементов массивов. Если хочешь разные массивы, то подшамань.
     
  10. -=Cerberus=-

    -=Cerberus=- κρυπτός γράφω

    Joined:
    29 Apr 2012
    Messages:
    1,321
    Likes Received:
    930
    Reputations:
    391
    ajiuratop

    вот мой вариант решения задачи (если уместно использовать списки, подходит для массивов разной длинны, условие массив А >= 1):

    static void Main(string[] args)
    {
    var m1 = new int[10] { 11, 23, 44, 2, 34, 23, 2, 44, 44, 34 }.ToList(); //инициализация массива
    var m2 = new int[10] { 11, 2, 4, 34, 34, 11, 2, 44, 44, 2 }.ToList(); //с конвертацией в List<>
    var result = new List<int>(); //сюда пишем очищенный массив m1(A)

    foreach (var i in m1) //бежим по списку m1(А)
    {
    int pos1Inm1 = m1.IndexOf(i); //дергаем индекс первого вхождения в список элемента i
    int pos2Inm1 = m1.LastIndexOf(i);//дергаем индекс последнего вхождения в список элемента i
    int pos1Inm2 = m2.IndexOf(i); //тоже самое
    int pos2Inm2 = m2.LastIndexOf(i);//тоже самое

    //создаем условие задачи
    // - в списке А индексы элемента не должны совпадать
    // - в списке В индексы элемента не должны совпадать
    // - элемент не должен присутствовать в результирующем списке
    if ((pos1Inm1 != pos2Inm1) && (pos1Inm2 != pos2Inm2) && (!result.Contains(i)))
    {
    result.Add(i); //добавить в результат А
    Console.Write("{0} ",i);
    }
    }

    Console.ReadKey();
    }

    для указанных в примере значений массивов А и В
    результирующий массив А {44, 2, 34}
     
  11. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Задание не мешает читать более внимательно.
    1. Использовать именно массив[n]
    2. Минимум по 2 одинаковых числа в обоих массивах.
    3. Как результат у тебя должно выйти А (11,23)
     
  12. -=Cerberus=-

    -=Cerberus=- κρυπτός γράφω

    Joined:
    29 Apr 2012
    Messages:
    1,321
    Likes Received:
    930
    Reputations:
    391
    ам сорри действительно не так понял. Но все равно через индексы красивее :)


    TO: shiku

    var buf = new Char[36] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; // алфавит из которого будет генерироваться случайная строка
    var rnd = new RNGCryptoServiceProvider(); //рандомайзер из CryptoAPI
    var ch2 = new byte[1]; //буффер

    for (int j = 0; j < 100; j++)
    {
    for (int i = 0; i < 10; i++)
    {
    rnd.GetBytes(ch2); //получить случайнный байт {0..255}

    int pos = ch2[0] % buf.Length; //немного математики чтобы получить индекс символа в алфавите
    Console.Write(buf[pos]); //символ
    }
    Console.ReadKey();
    Console.WriteLine();
    }

    жмем ENTER смотрим на случайнные строки
     
    #1552 -=Cerberus=-, 6 May 2013
    Last edited: 7 May 2013
  13. shiku

    shiku Member

    Joined:
    6 Aug 2009
    Messages:
    0
    Likes Received:
    25
    Reputations:
    1
    Привет всем. Такой вопрос, я создаю дополнительный поток :

    Thread t = new Thread(f1);
    t.Start();

    В методе f1 есть обращение к контролу формы:

    j = richTextBox1.Lines.Count();

    Что выдает ошибку о невозможности обращения к элементу созданному в другом потоке. Подскажите как такое решается?
     
  14. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    Делегаты.
     
  15. mrDebian

    mrDebian Member

    Joined:
    27 Jan 2013
    Messages:
    96
    Likes Received:
    13
    Reputations:
    10
    Почитай https://forum.antichat.ru/thread169454.html
     
    1 person likes this.
  16. shiku

    shiku Member

    Joined:
    6 Aug 2009
    Messages:
    0
    Likes Received:
    25
    Reputations:
    1
    Подскажите как правильно зацикливать работу потоков? Вот есть код:

    while (true)
    {

    Thread[] Thrd = new Thread[10];
    for (int i = 0; i < 10; i++)
    {
    Thrd = new Thread(f);
    Thrd.Start();
    }
    System.Threading.Thread.Sleep(5000);
    }

    Вобщем суть чтоб потоки отрабатывали, потом заданное колличество времени ждем и поновой запускаем потоки. Но они не запускаются почему то. Намекните в чем я ошибаюсь плиз? Вроде бы поток нельзя запускать повторно, но ведь разве тут не создаются каждый раз новые объекты?
     
  17. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73

    Может через рекурсию попробовать? )
    PHP:
    static void callThreads() 

         
    Thread[] Thrd = new Thread[10];
         for (
    int i 010i++) 
         {
              
    Thrd[i] = new Thread(f); Thrd[i].Start(); 
         } 
         
    System.Threading.Thread.Sleep(5000); 
         
    callThreads(); 
    }
     
  18. -=Cerberus=-

    -=Cerberus=- κρυπτός γράφω

    Joined:
    29 Apr 2012
    Messages:
    1,321
    Likes Received:
    930
    Reputations:
    391
    shiku

    http://msdn.microsoft.com/en-us/library/3dasc8as(v=vs.80).aspx

    суть, используешь Thread Pool

    ожидаешь завершения работы всех потоков, запускаешься по новому.

    в примере все довольно понятно.

    удачи! :)
     
  19. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    отличная идея, давайте переполним стек.
     
  20. shiku

    shiku Member

    Joined:
    6 Aug 2009
    Messages:
    0
    Likes Received:
    25
    Reputations:
    1
    Есть у кого пример авторизации по ftp с отправкой файла?
     
Loading...
Similar Threads - Java начинающим задаем
  1. b3
    Replies:
    4
    Views:
    2,874