Вопрос:

Не могу понять, как копировать числа из файла в массивы

c# arrays file-io

78 просмотра

5 ответа

45 Репутация автора

Я только начал изучать C # и получил небольшую проблему с чтением из файла. Мой файл называется data.dat и выглядит так:

6  
1 5  
4 5  
1 4  
7 3  
3 6  
4 7  

Первая строка в этом файле должна быть прочитана в одно целое число, и это означает количество задач (сколько пар чисел в этом файле, начиная со второй строки и до конца). Еще одна строка - пара чисел - напр. (1, 5). Первые числа в этих парах (1-й столбец) должны быть добавлены в один массив - pArray = {1, 4, 1, 7, 3, 4}, 2-й столбец должен быть добавлен в другой массив - rArray = {5, 5, 4, 3, 6, 7}.

using (TextReader reader = File.OpenText(@"pathToFile")){
    numberOfTaks = int.Parse(reader.ReadLine());   }

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

Автор: Ensz Источник Размещён: 09.03.2017 01:17

Ответы (5)


0 плюса

2028 Репутация автора

Решение
You could do something like:

int count = int.Parse(file.ReadLine().Trim());
int[] pArray = new int[count], rArray = new int[count];
for (int i = 0; i < count; i++){
    string[] line = file.ReadLine().Split(' ');
    pArray[i] = int.Parse(line[0].Trim());
    rArray[i] = int.Parse(line[1].Trim());
}
Автор: dcg Размещён: 09.03.2017 01:21

0 плюса

36 Репутация автора

вся строка (на мой взгляд) должна проходить через строковую переменную, и вы можете считать количество строк. Для каждого отдельного номера вы можете сделать что-то вроде этого:

string myLine = reader.ReadLine();
string firstChar = myLine.Split(0,1); // To take the first char

и сделать это для всех строк. Если попытаться с отладкой не так сложно. После того, как у вас есть все символы в строке, вы можете создать свой массив. Надеюсь, это поможет вам понять. До свидания!

Автор: Dario Benevento Размещён: 09.03.2017 01:25

0 плюса

5753 Репутация автора

это один из подходов (при условии, что формат вашего файла правильный) ...

//read all lines from file
List<string>lines = File.ReadAllLines(@"pathToFile").ToList();
int number = int.Parse(lines[0]);
//list to hold first column
List<int> firstList = new List<int>();
//list to hold second
List<int> secondList = new List<int>();
for (int i = 1; i< lines.Count; i++) // iterate through all lines, starting at second (index 1)
{
    //split line by space
    string[] numbersFromLine = lines[i].Split(' ');
    //put first part of splitted line into list
    firstList.Add(int.Parse(numbersFromLine[0]));
    //put second part of splitted line into list
    secondList.Add(int.Parse(numbersFromLine[1]));
}

и, если вам действительно нужны массивы, вы можете конвертировать в массивы из списка следующим образом:

var firstArray = firstList.ToArray();
var secondArray = secondList.ToArray();
Автор: Nino Размещён: 09.03.2017 01:26

1 плюс

6230 Репутация автора

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

// using statement
using System.Linq;

// Reads the data file into memory
var pairs = File.ReadAllLines(@"C:\path\to\file\data.dat");

// Skip the first line, split each line by space, take first element, convert to int
var pArray = pairs.Skip(1).Select(x => Convert.ToInt32(x.Split(' ')[0]));

// Same as above, but take second element
var rArray = pairs.Skip(1).Select(x => Convert.ToInt32(x.Split(' ')[1]));

Выход:

pArray = {1, 4, 1, 7, 3, 4}
rArray = {5, 5, 4, 3, 6, 7}

Два массива на самом деле IEnumerable, если вы хотите, чтобы .ToArray()на конце был прямой массив, например:

var pArray = pairs.Skip(1).Select(x => Convert.ToInt32(x.Split(' ')[0])).ToArray();
Автор: Equalsk Размещён: 09.03.2017 01:31

0 плюса

96 Репутация автора

Вы могли бы сделать что-то вроде этого:

// Read in the complete file
string fileContents = File.ReadAllText(@"pathToFile");

// Split on all Whitespace (removing all empty entries)
string[] numbers = fileContents.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);

// Process all the numbers
int numberOfRows = int.Parse(numbers[0]);

int[] pArray = new int[numberOfRows];
int[] rArray = new int[numberOfRows];

for (int i = 0; i < numberOfRows; i++)
{
    pArray[i] = int.Parse(numbers[(i * 2) + 1]);
    rArray[i] = int.Parse(numbers[(i * 2) + 2]);
}
Автор: Jason Hunt Размещён: 09.03.2017 01:52
Вопросы из категории :
32x32