Сумма чисел последовательности

В первых четырёх байтах входного файла задано число ? — количество чисел в последовательности (1 <= ? <=10000). Далее заданы сами целые числа последовательности: ? штук по 4 байта в каждом. Все числа по абсолютной величине не превышают 10^5. Требуется найти сумму ? чисел последовательности и вывести её как 4-байтовое целое число. введите сюда описание изображения Весь ввод и вывод в данной задаче бинарный. В каждом конкретном тесте все числа записаны с одинаковым порядком байтов: это может быть либо big-endian, либо little-endian. Однако в разных тестах порядок байтов может быть разным. Выводить число в ответ требуется с тем же порядком байтов, с которым заданы входные данные.

вот мой пример, но ничего не выводится вообще... В чем дело, подскажите пожалуйста

#include<stdio.h>
#include <math.h>
int main() {
    FILE* input;
    fopen_s(&input, "input.bin", "rb");
    FILE* output;
    fopen_s(&output, "output.bin", "wb");

    int N;
    scanf("%d", &N);
    fread(&N, sizeof(int), 1, input);
    fread(&S, sizeof(int), 1, input);

for(int i=0; i<N; i++){
int S = (int)(((double)S));

fwrite(&S, sizeof(int), 1, output);


return 0;
}

Ответы (1 шт):

Автор решения: Harry

Ой. Меня не туда занесло - не увидел, что файлы таки бинарные. Для бинарных все проще -

int needRev = 0;

unsigned int reverse(unsigned int s)
{
    unsigned int a[4];
    a[3] = s&0xFF;
    a[2] = (s>>8)&0xFF;
    a[1] = (s>>16)&0xFF;
    a[0] = (s>>24)&0xFF;
    return a[0] + (a[1] << 8) + (a[2] << 16) + (a[3] << 24);
}

int main(int argc, const char * argv[])
{
    FILE * in = fopen("input.bin","rt");
    unsigned int N;
    fread(&N,4,1,in);
    if (N > 10000) { needRev = 1; N = reverse(N); }
    unsigned int sum = 0;
    for(int i = 0; i < N; ++i)
    {
        unsigned int m;
        fread(&m,4,1,in);
        if (needRev) m = reverse(m);
        sum += m;
    }

    FILE * out = fopen("output.bin","wt");

    if (needRev) sum = reverse(sum);

    fwrite(&sum,4,1,out);

    fclose(in);
    fclose(out);
}

Тем не менее старый ответ оставлю - на тот случай, если вам такая задача попадется для текстовых файлов...

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

int needRev = 0;

unsigned int reverse(unsigned int s)
{
    unsigned int a[4];
    a[3] = s&0xFF;
    a[2] = (s>>8)&0xFF;
    a[1] = (s>>16)&0xFF;
    a[0] = (s>>24)&0xFF;
    return a[0] + (a[1] << 8) + (a[2] << 16) + (a[3] << 24);
}

unsigned int getint(FILE * f)
{
    unsigned int s[4];
    for(int i = 0; i < 4; ++i) fscanf(f,"%x",&s[i]);
    unsigned int res = s[0] + (s[1] << 8) + (s[2] << 16) + (s[3] << 24);
    return needRev ? reverse(res) : res;
}


int main(int argc, const char * argv[])
{
    FILE * in = fopen("input.bin","rt");
    unsigned int N = getint(in);
    if (N > 10000) { needRev = 1; N = reverse(N); }
    unsigned int sum = 0;

    for(int i = 0; i < N; ++i)
        sum += getint(in);

    FILE * out = fopen("output.bin","wt");

    unsigned int a[4];
    a[3] = sum&0xFF;
    a[2] = (sum>>8)&0xFF;
    a[1] = (sum>>16)&0xFF;
    a[0] = (sum>>24)&0xFF;

    fprintf(out,"%02X %02X %02X %02X\n",
            needRev ? a[0] : a[3],
            needRev ? a[1] : a[2],
            needRev ? a[2] : a[1],
            needRev ? a[3] : a[0]);

    fclose(in);
    fclose(out);
}
→ Ссылка