david_goder Ответов: 3

Как прочитать большой поток целых чисел из файла в C#?


Здравствуйте, я хочу прочитать файл и поместить его в массив 1D int, как я могу это сделать?
Я попробовал следующее, Но это дает мне целочисленное переполнение. Я хочу читать только целые числа, а не символы.

ошибка, которую я получаю, такова:
Необработанное Исключение: Система.OverflowException: значение было либо слишком большим, либо слишком большим.
большим для int32.
в системе.номер.ParseInt32 (String s, numberstyles style, NumberFormatInfo in
фо)
в системе.Типа int32.Синтаксический анализ(строки s)
в tofile_2.Программы.Основные(string[] аргументы) в c:\users\user\documents\visual Стю
программа проектов Дио 2015\\tofile_2\\tofile_2.CS:линия 80


Спасибо!

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

string fileContent = File.ReadAllText(@"C:/Users/user/Desktop/deskt/bacteria.txt");
            string[] integerStrings = fileContent.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
            int[] integers = new int[integerStrings.Length];
            for (int n = 0; n < integerStrings.Length; n++)

                integers[n] = int.Parse(integerStrings[n])

Patrice T

Насколько он велик ?

david_goder

файл очень большой более 10 000 интов

Patrice T

разместите пять строк файла.

Richard MacCutchan

Нам нужно увидеть данные, а вам нужно показать точное сообщение об ошибке и место ее возникновения. Кроме того, лучше использовать TryParse скорее, чем Parse, так что вы можете поймать любые искаженные числа.

david_goder

Необработанное Исключение: Система.OverflowException: значение было либо слишком большим, либо слишком большим.
большим для int32.
в системе.номер.ParseInt32 (String s, numberstyles style, NumberFormatInfo in
фо)
в системе.Типа int32.Синтаксический анализ(строки s)
в tofile_2.Программы.Основные(string[] аргументы) в c:\users\user\documents\visual Стю
программа проектов Дио 2015\\tofile_2\\tofile_2.CS:линия 80

Richard MacCutchan

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

Patrice T

В чем проблема с этим кодом?

OriginalGriff

Как говорит Ричард, нам нужно увидеть образец данных из файла, потому что на данный момент мы понятия не имеем, как он выглядит, и это влияет именно на то, что вам нужно сделать.
Но...вы не хотите создавать массив целых чисел с таким количеством элементов, как в файле есть символы: количество целых чисел будет значительно меньше, если только каждый символ не является отдельным числом (а если это так, то лучше выбрать массив байтов).
Используйте виджет" улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

david_goder

хорошо я тоже добавлю файл

david_goder

извините, я не могу найти кнопку Добавить файл, но я скажу, что здесь файл полон чисел от 0 до 4, и они равны 10 00 или более

3 Ответов

Рейтинг:
14

OriginalGriff

"Я заполняю этот файл с помощью c++ без каких-либо интервалов, чтобы он распознал его как один int"
И в этом твоя проблема.
Если вы не разделяете данные пробелом (или запятой), никто не может сказать, является ли 12345678901234567890 12, 345, 6, 7, 89, ... или 1, 2, 3, 4567890123456, ...
Таким образом, система пытается прочитать его как одно огромное целое число и терпит неудачу.

Вам нужно вернуться к коду C++ и сгенерировать более "разумные" данные: либо каждое значение в отдельной строке, либо через запятую (или лучше всего сочетание того и другого, если в данных есть какая-то "организация").


david_goder

хорошо, я хорошо разбираюсь в c++, но не в c#, так что у меня есть еще один вопрос. если я пишу такой текст, то мне нужно прочитать его как один поток и превратить в 3d-массив, как я могу это сделать?

david_goder

У меня был следующий код:

строка text_b = файл.ReadAllText(@"C:/Users/user/Desktop/deskt/bacteria.txt", Кодирование.Кодировке utf8);

for (int i = 0; i < maxgeneration; i++)
for (int j = 0; j < popsize; j++)
for (int k = 0; k < genesize; k++)
{
bact_array[я,J,к] = text_b[б];
b++;
}


но он включает в себя' \n ' char, я думаю, что этот файл делает это автоматически.
b здесь является статическим int.

OriginalGriff

Этот код подразумевает, что значения в вашем текстовом файле не являются целыми числами: это отдельные байты, и вы помещаете каждый символ в отдельный элемент вашего bact_array.
Если вы игнорируете, что это C#, и притворяетесь, что это C, он делает точно то же самое!.
Как выглядит код C++, который генерирует данные?

david_goder

этот код преобразует ints в char, как я могу этого избежать?

Рейтинг:
0

Patrice T

Цитата:
Необработанное Исключение: Система.OverflowException: значение было либо слишком большим, либо слишком большим.
большим для int32.
Вероятно, у вас есть очень большое целое число, которое не вписывается в 32-битное целое число.
Вам нужно переключиться на unsigned integer или long тип данных.

Чтобы узнать, какое значение дает вам проблема, добавьте строку в цикл for
string LastInteger= integerStrings[n];

и отладчик покажет вам, что это за значение.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


david_goder

Я заполняю этот файл с помощью c++ без каких-либо интервалов, чтобы он распознал его как один int

Patrice T

Покажите часть файла данных, всего несколько строк.

Рейтинг:
0

david_goder

Я действительно нашел решение :)

for (int i = 0; i < maxgeneration; i++)
              for (int j = 0; j < popsize; j++)
                  for (int k = 0; k < genesize; k++)
                  {
                      bact_array[i,j,k] = (int)char.GetNumericValue(text_b[b]);
                      b++;
                  }



Я использовал этот метод, я читаю символы, поэтому мне нужно преобразовать их в ints

int i = (int)char.Метод getnumericvalue(с);


Patrice T

Понимаете ли вы, что с таким маленьким снайпсетом невозможно понять, что вы делаете.
И вы не предоставили самые важные данные, которые являются частью файла.