// хорошо, спасибо за помощь. Я отредактировал код, передал указатель, и теперь он печатает число из определенной строки, печатает номер этой строки и выводит сумму всех последовательных чисел. Пока хорошо, но ... Что я хочу сделать дальше, так это присвоить каждую из сумм массиву, чтобы я мог использовать цикл 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);
}
Вы видели какие-нибудь предупреждения от компилятора?
никаких предупреждений от компилятора
Тогда выбросьте это. Перед вызовом у вашей функции не было прототипа. И вызывается с неправильным числом аргументов. Если компилятор не предупреждает об этом, это мусор, или вы явно отключили предупреждения.
Обратите внимание, что вам часто приходится включать предупреждения при компиляции. Например, с gdb вы должны скомпилировать с флагом компилятора -Wall, чтобы включить большинство предупреждающих сообщений.
@bruceg С gcc наверное ...
@EugeneSh. ха-ха ... ой. Слишком поздно редактировать.
опубликованный код не компилируется. При компиляции включите предупреждения, а затем исправьте эти предупреждения. (для gcc, как минимум: -Wall -Wextra -pedantic -Wconversion -std=gnu11) Примечание: другие компиляторы используют разные параметры для выполнения тех же функций.
@bruceg, -Wall - это НЕ способ получить максимальную информацию от gdb. Скорее используйте опцию: -ggdb3 как на этапах компиляции, так и при связывании. И если вы действительно имели в виду gcc, вариант: -Wall - это только начало того, что необходимо, см. Мой предыдущий комментарий
НИКОГДА не используйте while (!feof (file)). Он не делает того, что вы ожидаете. предложите: while( fscanf (file, "%d", &i); == 1 ) и удалите вызов fscanf() с конца цикла
относительно: result=result+i; локальная переменная, определенная в другой функции, невидима в другой функции. I.E. локальная переменная "выходит за рамки"
для удобства чтения и понимания: пожалуйста, последовательно делайте отступы в коде. Отступ после каждой открывающей скобки "{". Uningent перед каждой закрывающей фигурной скобкой "}". Предложите каждому уровню отступа 4 пробела
в отношении: #include <math.h> Это плохая практика программирования. Включайте файлы заголовков, содержимое которых не используется.
я сделал некоторые улучшения, но теперь другая проблема
касательно; int n=1; //row number// int tab[n]; //array и `tab [n] == результат; .... n ++; `объявление tab[] объявляет только одну запись в этой таблице. Как только вы пытаетесь присвоить значение после tab[0], код записывается в память за концом таблицы. Это неопределенное поведение, которое может привести к событию ошибки сегмента. Кстати: в C индекс в массиве находится в диапазоне 0 ... (количество элементов в массиве -1)
относительно: printf("\nnumber from row number one is ... : %d\n", tab[1]);, поскольку переменная tab[] имеет только один элемент, а первый элемент в массиве имеет индекс 0, поэтому этот оператор печати пытается прочитать память за пределами конца таблицы.
пожалуйста, НЕ изменяйте опубликованный код. Скорее добавьте EDIT, показывающий исправленный код как отдельный блок.





Ваш код в основном правильный. Вы просто неправильно вызываете 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)) не прав -
@EugeneSh. Для его однопоточного назначения класса, возможно, это будет нормально. Но определенно проверка файла на NULL - всегда хорошая идея. Я обновлю свой ответ.
следующий предлагаемый код:
stderr, включая текстовую причину, по которой система считает, что ошибка произошла.fscanf() для управления цикломvoid внутри main() и прототипа подфункции, которая не получает параметров.А теперь предлагаемый код:
#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 последовательных целых чисел
единственная причина, по которой это не сработает, состоит в том, что файл содержит не целые числа и пробелы. I.E. если это не сработает для вас, то входной файл содержит что-то еще, например, запятую или точку с запятой и т. д.
ваш входной файл содержит «широкие» символы? если это так, то исходный опубликованный код пытается работать с неправильными символами. Пожалуйста, опубликуйте первые несколько строк входного файла. (еще одна причина разместить минимальный воспроизводимый пример)
// хорошо, теперь код выглядит лучше, но все же значения результатов не сохраняются в массиве 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);
}
привет, ребята, что вы думаете об этой ситуации?
Функция принимает 2 аргумента, но вы передаете 0.