2017-01-27 2 views
-3

Я совершенно новичок в программировании на языке C (только для Java), и заявления различны, чтобы смутить меня. Мне было интересно, объявляет ли мой заголовок метода, что мне нужно объявить Nrows и Ncols (из моего основного метода) в методе? просто устанавливает их для определенной переменной?Этот метод возвращает int Nrows и int Ncols?

#include <stdio.h> 

void RdSize(int *Nrows, int *Ncols) 
{ 
    Nrows = NULL; 
    Ncols = NULL; 
    FILE *in = fopen("A1in.txt","r"); 
    if(in == NULL) { perror("Error opening file");} 
    else 
    { 
     int i; 
     char input[4]; //I have no idea how to set the size of the array to 
         //the length of the first line of the input file 
         //(which has 4 chars, but is not optimal to put the 
         //number 4) 

     for(i = 0; i < sizeof(input); i++) 
     { 
      input[i] = fgetc(in); //trying to copy each char into input[] 
            //array 

      if(isdigit(input[i]) && Nrows == NULL) 
      { 
       Nrows = input[i] - '0'; //converting from char to int 
      }       //Here I'm setting Nrows to 
             //something. Is this all I do? 
      if(isdigit(input[i]) && Nrows != NULL) 
      { 
       Ncols = input[i] - '0'; //converting from char to int 
      }       //setting Ncols 
     } 
    } 
    fclose(in); 
} 

Кроме того, если у меня был .txt документ, который выглядит следующим образом:

0 0 0 0 0 0 0 
0 1 0 1 0 1 0 
0 1 1 1 0 1 0 
0 1 0 1 0 1 0 
0 0 0 0 0 0 0 

Что бы быть лучшим способом поместить это в 2d массив символов из файла .txt?

Большое спасибо!

+0

Вы говорите, что первая строка файла имеет 4 символа, но пример, который вы показываете, имеет 13 символов. Что он? – Barmar

+0

Нельзя назначать 'Nrows' и' Ncols'. Поскольку они являются указателями, вам необходимо косвенным образом установить переменную вызывающего: '* Nrows = ;' – Barmar

+2

Непонятно, что должна делать эта функция. Вам нужно четко объяснить это, и что происходит не так. – Barmar

ответ

1

Чтобы прочитать два числа из первой строки файла, вы можете просто использовать fscanf() вместо петли.

void RdSize(int *Nrows, int *Ncols) 
{ 
    FILE *in = fopen("A1in.txt","r"); 
    if(in == NULL) { 
     perror("Error opening file"); 
     return; 
    } 
    if (fscanf(in, "%d %d", Nrows, Ncols) != 2) { 
     printf("Error reading size\n"); 
    } 
    fclose(in); 
} 

%d означает разобрать целое число в файле. Цифры записываются в память, на которые указывают Nrows и Ncols, которые являются переменными вызывающего.

+0

Итак, если бы я использовал этот метод в моем основном методе, а затем использовал переменные, которые я вложил в этот метод, они изменились бы на то, что я сделал в этом методе? Скажем в моем основном методе: int x = 2; int y = 3 ;, затем RdSize (x, y); то printf («% d% d», x, y), они будут другими? – JRoge

+1

Это должно быть 'RdSize (& x, &y);' в вызывающей функции. * Вы действительно хотите изучать язык. SO не является классом программирования. – Barmar

+0

Вы удаляете 'Nrows = NULL; Ncols = NULL;' и 'fclose (в), переходите в else-block. – BLUEPIXY

0

Ответ сортировки - нет. Подобно Java, параметры метода/функции должны быть определены в другом месте и переданы в ... целях параметров.

Nrows и Ncols являются int указателями, а это означает, что вместо того, чтобы держать само значение, они хранят адрес в памяти, что значение удерживается, который может быть доступом разыменования указателя с префиксом *, такой, как *Ncols.

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

https://users.cs.cf.ac.uk/Dave.Marshall/C/node10.html

Смежные вопросы