Не могу прочитать все числа из текстового файла в C - PullRequest
0 голосов
/ 13 января 2019

У меня есть программа, которая работает в MPI. Хотя реальная проблема - это только часть программы, где процессор 0 считывает из txt-файла некоторые числа в динамический массив. Чтобы определить, что я сканирую до конца файла, я использую указатель файла и делю результат на 4 (это число байтов, в котором нуждается каждый int) и должен иметь правильный размер для выделения памяти. Проблема в том, что он работает не так, как задумано, и в итоге получает половину размера, поэтому я прочитаю половину файла, и программа не будет корректной.

Я попытался поочередно отформатировать числа в файле, предполагая, что это проблема такого рода, но ничего.

Мои данные.txt: 1 2 3 4 5 6 7 8 9 10 11 12

Раздел кода, который читает из файла:

           fp = fopen("Data.txt", "r");
           if (fp == NULL) {
                fprintf(stderr, "Error while opening file.\n");
                MPI_Abort(newComm, 2);
            }

            fseek(fp, 0, SEEK_END);
            n = ftell(fp);
            n /= sizeof(int);
            printf("n = %d\n", n);
            fseek(fp, 0, SEEK_SET);

            workLoad = n / p;

            if (n % p != 0) {
                fprintf(stderr, "The number of elements in the file MOD the number of proccessors must equal zero.\n");
                MPI_Abort(newComm, 2);
            }

            arr = (int*)malloc(n * sizeof(int));
            if (arr == NULL) {
                fprintf(stderr, "Error in malloc!\n");
                MPI_Abort(newComm, 1);
            }

            for (i = 0; i < n; i++)
                fscanf(fp, "%d", arr + i);

            fclose(fp);

            printf("Numbers loaded from file.\n");
            break;

Ожидаемый результат должен быть массивом с 12 элементами, такими как номера файла.

Фактический вывод - это массив из 6 элементов до числа 6, что составляет половину фактического размера.

1 Ответ

0 голосов
/ 13 января 2019

ваш файл содержит числа в ascii, вы не можете сравнить размер файла с чем-либо на основе sizeof(int)

       fseek(fp, 0, SEEK_END);
        n = ftell(fp);
        n /= sizeof(int);

не дают количество чисел в файле

...