C lang текстовый файл ввод суммы цифр в строках

// хорошо, спасибо за помощь. Я отредактировал код, передал указатель, и теперь он печатает число из определенной строки, печатает номер этой строки и выводит сумму всех последовательных чисел. Пока хорошо, но ... Что я хочу сделать дальше, так это присвоить каждую из сумм массиву, чтобы я мог использовать цикл for, чтобы проверить, равна ли полученная сумма каким-либо предыдущим полученным суммам. я использую tab [n] == результат; к сожалению, после завершения цикла while все элементы массива пусты ... спасибо //

включают

включают

int main()
{
    int result =0;

    read_ints("numbers.txt", &result);


}



void read_ints (const char* file_name, int *result)
{

  FILE* file = fopen ("numbers.txt", "r");
  int i = 0;
  int n=1; //row number//
  int tab[n]; //array

  if (file == NULL)
  {
   printf("unable to open file %s", file_name);

  }
  fscanf (file, "%d", &i);
  while (!feof (file))
    {
      printf ("%d ", i);
      *result += i;
      tab[n]==result;
      printf("row number: %d \n", n);
      n++;

      printf("\n sum of this number and all numbers before is: %d\n", *result);

      fscanf (file, "%d", &i);

    }
          printf("\nnumber from row number one is ... : %d\n", tab[1]);
  fclose (file);



}

Функция принимает 2 аргумента, но вы передаете 0.

Johnny Mopp 04.01.2019 22:21

Вы видели какие-нибудь предупреждения от компилятора?

Eugene Sh. 04.01.2019 22:23

никаких предупреждений от компилятора

user10798561 04.01.2019 22:27

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

Eugene Sh. 04.01.2019 22:34

Обратите внимание, что вам часто приходится включать предупреждения при компиляции. Например, с gdb вы должны скомпилировать с флагом компилятора -Wall, чтобы включить большинство предупреждающих сообщений.

bruceg 04.01.2019 22:38

@bruceg С gcc наверное ...

Eugene Sh. 04.01.2019 22:48

@EugeneSh. ха-ха ... ой. Слишком поздно редактировать.

bruceg 04.01.2019 22:50

опубликованный код не компилируется. При компиляции включите предупреждения, а затем исправьте эти предупреждения. (для gcc, как минимум: -Wall -Wextra -pedantic -Wconversion -std=gnu11) Примечание: другие компиляторы используют разные параметры для выполнения тех же функций.

user3629249 05.01.2019 00:45

@bruceg, -Wall - это НЕ способ получить максимальную информацию от gdb. Скорее используйте опцию: -ggdb3 как на этапах компиляции, так и при связывании. И если вы действительно имели в виду gcc, вариант: -Wall - это только начало того, что необходимо, см. Мой предыдущий комментарий

user3629249 05.01.2019 00:47

НИКОГДА не используйте while (!feof (file)). Он не делает того, что вы ожидаете. предложите: while( fscanf (file, "%d", &i); == 1 ) и удалите вызов fscanf() с конца цикла

user3629249 05.01.2019 00:57

относительно: result=result+i; локальная переменная, определенная в другой функции, невидима в другой функции. I.E. локальная переменная "выходит за рамки"

user3629249 05.01.2019 00:59

для удобства чтения и понимания: пожалуйста, последовательно делайте отступы в коде. Отступ после каждой открывающей скобки "{". Uningent перед каждой закрывающей фигурной скобкой "}". Предложите каждому уровню отступа 4 пробела

user3629249 05.01.2019 02:33

в отношении: #include <math.h> Это плохая практика программирования. Включайте файлы заголовков, содержимое которых не используется.

user3629249 05.01.2019 02:39

я сделал некоторые улучшения, но теперь другая проблема

user10798561 06.01.2019 21:24

касательно; int n=1; //row number// int tab[n]; //array и `tab [n] == результат; .... n ++; `объявление tab[] объявляет только одну запись в этой таблице. Как только вы пытаетесь присвоить значение после tab[0], код записывается в память за концом таблицы. Это неопределенное поведение, которое может привести к событию ошибки сегмента. Кстати: в C индекс в массиве находится в диапазоне 0 ... (количество элементов в массиве -1)

user3629249 07.01.2019 05:05

относительно: printf("\nnumber from row number one is ... : %d\n", tab[1]);, поскольку переменная tab[] имеет только один элемент, а первый элемент в массиве имеет индекс 0, поэтому этот оператор печати пытается прочитать память за пределами конца таблицы.

user3629249 07.01.2019 05:08

пожалуйста, НЕ изменяйте опубликованный код. Скорее добавьте EDIT, показывающий исправленный код как отдельный блок.

user3629249 07.01.2019 05:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
17
140
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш код в основном правильный. Вы просто неправильно вызываете read_ints. Вы должны передать указатель на результат, если хотите, чтобы было возвращено значение.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void read_ints (const char* file_name, int *result) {
    FILE* file = fopen (file_name, "r");
    int i = 0;

    if (file == NULL) {
        printf("unable to open file %s\n", file_name);
        return;
    }

    fscanf (file, "%d", &i);
    while (!feof (file))
    {
        printf ("%d ", i);
        *result += i;
        printf("\n suma tej liczby ze wszystkimi poprzednimi wynosi: %d\n", *result);
        fscanf (file, "%d", &i);

    }
    fclose (file);
}

int main() {
    int result =0;

    read_ints("liczby.txt", &result);

}

На самом деле это в основном неверно. При открытии файла нет проверки ошибок, также while (!feof (file)) не прав -

Eugene Sh. 04.01.2019 22:49

@EugeneSh. Для его однопоточного назначения класса, возможно, это будет нормально. Но определенно проверка файла на NULL - всегда хорошая идея. Я обновлю свой ответ.

bruceg 04.01.2019 22:52

Единственное, что вас здесь спасает, это то, что fscanf находится в конце цикла а (! feof (файл)) всегда ошибочен?, так что значение i не используется между вызовом fscanf и проверкой feof. Это неправильно, но по счастливой случайности Неопределенное поведение не вызывается.

David C. Rankin 05.01.2019 02:36

следующий предлагаемый код:

  1. правильно проверяет на наличие ошибок
  2. правильно передает текст ошибки в stderr, включая текстовую причину, по которой система считает, что ошибка произошла.
  3. использует возвращаемое значение из fscanf() для управления циклом
  4. правильно содержит "прототип" для подфункции
  5. правильно использует void внутри main() и прототипа подфункции, которая не получает параметров.
  6. последовательно делает отступ в коде для удобства чтения
  7. чисто компилируется
  8. документы, почему включен каждый файл заголовка

А теперь предлагаемый код:

#include <stdio.h>   // FILE, perror(), fopen(), printf(), fclose()
#include <stdlib.h>  // exit(), EXIT_FAILURE



void read_ints ( void );


int main( void )
{
    read_ints();
}



void read_ints ()
{
    FILE* file = fopen ("liczby.txt", "r");
    if ( !file )
    {
      perror( "fopen to read liczby.txt failed" );
      exit( EXIT_FAILURE );
    }


    int i = 0;
    int result = 0;
    while ( fscanf ( file, "%d", &i) == 1 )
    {
      printf ("%d ", i);
      result=result+i;
      printf("\n suma tej liczby ze wszystkimi poprzednimi wynosi: %d\n", result);
    }
    fclose (file);
}

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

user10798561 06.01.2019 19:40

единственная причина, по которой это не сработает, состоит в том, что файл содержит не целые числа и пробелы. I.E. если это не сработает для вас, то входной файл содержит что-то еще, например, запятую или точку с запятой и т. д.

user3629249 07.01.2019 04:55

ваш входной файл содержит «широкие» символы? если это так, то исходный опубликованный код пытается работать с неправильными символами. Пожалуйста, опубликуйте первые несколько строк входного файла. (еще одна причина разместить минимальный воспроизводимый пример)

user3629249 07.01.2019 04:58
Ответ принят как подходящий

// хорошо, теперь код выглядит лучше, но все же значения результатов не сохраняются в массиве tab []. это связано с отсутствием указателя или неправильным объявлением массива (?).
Я задумал, что это будет динамический массив, поэтому мне не нужно объявлять конкретный размер массива.

#include <stdio.h>
#include <stdlib.h>
void read_ints(const char* file_name, int *result);

int main()
{
    int result =0;
    read_ints("numbers.txt", &result);
}
void read_ints (const char* file_name, int *result)
{
  FILE* file = fopen ("numbers.txt", "r");
  int i = 0;
  int n=0; //row number//
  int m;
  int tab[m]; //array//
  if (file == NULL)
  {
   printf("unable to open file %s", file_name);
  }
  while ( fscanf (file, "%d", &i) ==1)
    {
       n++;
      printf ("%d\n ", i);
      *result += i;
      printf("\n we are at row nr. %d sum of this number and all numbers before is: %d\n", n, *result);
       tab[n]==*result;
    }
          printf("\nnumber from row number one is ... : %d\n", tab[1]); //this does not work properly //
  fclose (file);
}

привет, ребята, что вы думаете об этой ситуации?

user10798561 08.01.2019 14:40

Другие вопросы по теме