computerpublic Ответов: 2

Попытка записи в файл


<pre>// I AM TRYING TO WRITE AND CREATE A FILE, USING ONLY ONE BIT AT A TIME.
// I AM WRITING THE FILE, BUT NOTHING GOES IN.
// ALSO I GETTING ERRORS FOR BEING OUTSIDE OF THE ARRAY.
using System;
using System.IO;
using System.Collections;
namespace Applica
{
    static class Program
    {
        static void Main(string[] args)
        {
            bool tif = true;
            byte[] buffer = BitConverter.GetBytes(tif);
            FileInfo ap = new FileInfo("tempii.txt");
            string filePath = ap.FullName;
            string destinationPath = Path.Combine("C:\\check", Path.GetFileName(filePath));
            using (Stream output = File.OpenWrite(destinationPath))
            {
                int bits = 32;
                while (bits > 0)
                {
                    for (int i = 1; i < 33; i++)//4 random bytes
                    {
                        if (tif == true)
                        {
                            tif = false;
                            goto A;
                        }
                        if (tif == false) tif = true;
                        A:;
                        output.Write(buffer, 0, bits);
                    }
                }
            }
        }
    }
}





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

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

Patrice T

Точное сообщение об ошибке и положение !

computerpublic

//Я изменил код, как вы предложили, и все еще получаю ту же ошибку. Пожалуйста, смотрите ниже.

использование системы;
использование системы.ИО;
использование системы.Коллекции;
приложение пространства имен
{
программа статического класса
{
static void Main(string[] args)
{
боол срок действия = правда;
byte[] buffer = BitConverter.GetBytes(tif);
FileInfo ap = новый FileInfo("tempii.txt");
строку путь к файлу = АП.Полное имя;
строка destinationPath = путь.Объединить("C:\\check", Путь.GetFileName(путь_к_файлу));
using (Stream output = File.OpenWrite(destinationPath))
{
int байт = 4;
while (байты > 0)
{
for (int i = 1; i < 33; i++)//4 случайных байта
{
if (tif == true)
{
срок действия = ложь;
}
else if (tif == false)
{
срок действия = правда;
}
выход.Запись(буфер, 0, байт);
}
}
}
}
}
}

Patrice T

Лучший стиль не подразумевает никакой ошибки или исправления.
Вы понимаете, что ваш цикл записывает 32 раза одно и то же в файл? или хотя бы попытаться писать.

2 Ответов

Рейтинг:
2

Patrice T

Эта петля

for (int i = 1; i < 33; i++)//4 random bytes
{
    if (tif == true)
    {
        tif = false;
        goto A;
    }
    if (tif == false) tif = true;
    A:;
    output.Write(buffer, 0, bits);
}

это плохое программирование, лучший стиль-это
for (int i = 1; i < 33; i++)//4 random bytes
{
    if (tif == true)
    {
        tif = false;
    }
    elseif (tif == false)
    {
        tif = true;
    }
    output.Write(buffer, 0, bits);
}

и может быть упрощен как
for (int i = 1; i < 33; i++)//4 random bytes
{
    output.Write(buffer, 0, bits);
}


Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]
Отладка кода C# в Visual Studio - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
1

an0ther1

Используйте свой отладчик.

Вы получите следующее сообщение об ошибке;
Ошибка: Необработанное исключение типа 'System.ArgumentException' произошло в mscorlib.dll
Дополнительная информация: Смещение и длина были вне границ массива или количество больше, чем количество элементов от индекса до конца исходной коллекции

Ошибка будет вызвана линией;

output.Write(buffer, 0, bits);

В соответствии с документацией MSDN - Течение.Метод Записи (Byte[], Int32, Int32) (System.IO)[^] - ручей.Метод записи принимает массив байтов (буфер), позицию для начала записи (позиция 0 в вашем случае) и количество байтов для записи (32 в вашем случае).
Байтовый массив, который вы передали, имеет длину 1 байт в любое время, следовательно, вы не можете написать 32 байта...

Дополнительно, идти к высказывания-это плохое Программирование, по мнению большинства людей. Обычно вы используете его, чтобы вырваться из глубоко вложенного цикла, и в большинстве случаев вы, вероятно, просто выйдете к другому методу

с уважением