Member 14042768 Ответов: 2

Как перезаписать в то время как streamwriter создает текстовый файл в C#


Всем Привет,

I am creating a code which uses streamwriter to create a new text file each time it is run, it puts all UI from textboxes into a text file. my issue is... in my code i have a textbox which is set to a code that converts all input (ascii) to hex and writes the hex values to text file, (I have set parameters to the textbox to accept only alpha-numeric values, and to only accept upto 27 characters). I need for any characters not filled by the user (up to 27) to be replaced by a 0, but need the (extra) 0 to be written to the text file and not turned to hex. I can only think to overwrite, but how to overwrite a file which is in the process of being created.

Я поместил основную часть своего кода, которая применяет параметры к пользовательскому интерфейсу и преобразует входные данные в шестнадцатеричный код, который затем записывается в новый текстовый файл, созданный кодом.

Заранее большое спасибо за любые предложения

Фазила

Что я уже пробовал:

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 Ascii_to_hex
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            
        }
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (!char.IsControl(e.KeyChar) && !char.IsLetterOrDigit(e.KeyChar))
                {
                    e.Handled = true;
                }
            }

        private void button2_Click(object sender, EventArgs e)
        {
            System.IO.StreamWriter objWriter;
            string name = label1.Text;
            objWriter = new System.IO.StreamWriter(name + ".inp");


            string str = textBox2.Text;
            char[] charValues = str.ToCharArray();
            string hexOutput = "";
            foreach (char _eachChar in charValues)
            {
                                                             
                int value = Convert.ToInt32(_eachChar);
                                                        
                hexOutput += String.Format("{0:X}", value);
                                                          
            }

            objWriter.WriteLine(hexOutput);

            objWriter.Close();
        }

2 Ответов

Рейтинг:
2

Gerry Schmitz

hexOutput = hexOutput.PadRight( 27, '0' );
objWriter.WriteLine(hexOutput);


Рейтинг:
1

BillWoodruff

Вот некоторые идеи, которые вы могли бы адаптировать:

using System;
using System.Linq;

namespace YourConverionLibrary
{
    public static class ConversionExtensions
    {
        public static byte[] ToByteAry(this string input, bool filterforAlpha = true)
        {
            if (filterforAlpha)
            {
                input = new string(input.Where(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c)).ToArray());
            }

            return input.Select(c => (byte) c).ToArray();
        }

        public static string ToHxFrmBytAry(this byte[] input)
        {
            return BitConverter.ToString(input);
        }
    }
}
Пример использования:
var test = "testing 1 2 3 !".ToByteAry().ToHxFrmBytAry();
Console.WriteLine(test);
Генерируемая строка:

74-65-73-74-69-6Е-67-20-31-20-32-20-33-20

обратите внимание на финал ! символ исключается, но последний пробел включен.


Richard Deeming

Я был бы склонен сделать ToByteAry взять IEnumerable<char> вместо а string Таким образом, вы можете избежать создания нового string чтобы отфильтровать нежелательные символы.

У вас также будут проблемы с символами вне стандартного диапазона ASCII. Вероятно, было бы лучше использовать System.Text.Encoding.Default.GetBytes, который будет обрабатывать их должным образом.

public static byte[] ToByteAry(this IEnumerable<char> input, bool filterforAlpha = true)
{
    if (filterforAlpha)
    {
        input = input.Where(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c));
    }
    	
    return Encoding.Default.GetBytes(input.ToArray());
}

BillWoodruff

- Я бы предпочел, чтобы Тобитири взял IEnumerable<char> вместо строки." ОП использует содержимое текстового поля в качестве источника: использование метода расширения строки имеет для меня смысл.

"У вас также будут проблемы с символами, выходящими за пределы стандартного диапазона ASCII." Почему?

Я утверждаю, что мой код отражает то, что хочет сделать ОП, даже если он недостаточно хорош для вас :)

Richard Deeming

Только что видел это - вы пропустили кнопку "ответить", или это была одна из многих недавних ошибок QA? :)

String инвентарь IEnumerable<char>; и если вы сделаете параметр IEnumerable<char>, вы можете отфильтровать его без необходимости создавать новый временный файл string для хранения отфильтрованных значений.

Один char эквивалентно a ushort. Если входная строка содержит символы, выходящие за пределы диапазона 0-255, актерский состав к byte будет либо переполняться (в непроверенном контексте), либо выбрасывать OverflowException (в проверенном контексте). ОП упомянул об ограничении ввода буквенно-цифровыми значениями, так что это может не быть проблемой для них. Я просто подумал, что об этом стоит упомянуть.

BillWoodruff

Привет, Ричард, конечно же, я нажал " ответить: как еще мессенджер будет выглядеть в качестве ответа ? Разве вы не получили уведомление ?

Я изучу ваш ответ позже сегодня, и я уверен, что буду учиться на нем.

Вы хотите сказать, что код может быть лучше, или вы хотите сказать, что в нем есть ошибка ?

Richard Deeming

Уведомления уже некоторое время путаются вокруг меня. :)

IEnumerable<char> против string это всего лишь незначительная настройка производительности. Но с тех пор Encoding.GetBytes требуется массив, я не уверен, что это будет иметь большое значение, если таковое вообще будет иметь место. Я просто предпочитаю избегать выделения новых строк, если этого можно избежать.

То Encoding.GetBytes vs приведение каждого персонажа к a byte мог потенциально это будет небольшая ошибка-ette, в зависимости от того, как будет использоваться значение и будет ли оно когда-либо содержать символы, отличные от ASCII. Например, если намерение состояло в том, чтобы преобразовать его обратно в исходную строку, вы не могли бы этого сделать, если бы приведение было переполнено.

BillWoodruff

Очень интересно !