Как я могу прочитать строку файла (целое число) и просуммировать итог от строки A до строки B?

#c #scanf #fseek

#c #scanf #fseek

Вопрос:

Допустим, file1.dat содержит:

 123
545
3576
3453
345
34
...
123     //1000th line
  

У меня возникли проблемы при попытке написать функцию addNumbers для вычисления итога от начала строки (переменная) до конца строки (переменная). Каждый дочерний процесс / канал должен вычислять свою собственную часть файла, добавляя каждую частичную сумму к окончательному итогу и выводя этот итог.

Переменная FileRead — это файловый объект, который передается в функцию.

Т.е. 4 дочерних процесса, 1000 строк, каждый процесс выполняет 250 строк. Вот мой рабочий код. Пожалуйста, задавайте любые вопросы.:

 division = numberOfLines/numberOfPipes;
int begin = currentPipe*division;
int end = begin   division;

for(i=begin; i<end; i  )
{
    fseek(fileRead, begin, SEEK_CUR);
    while(fgets(line,sizeof line,fileRead)!= NULL)
    {
    total = total   line;
    }
}
  

Комментарии:

1. @Olaf удалил ненужную информацию. теперь кто-нибудь прокомментирует «пожалуйста, отправьте код»

2. Пожалуйста, отправьте код. Вам нужно будет написать код, который ищет приблизительную границу между блоками, а затем выполняет поиск в дальнейшем, пока не найдет новую строку. Расположение новой строки — это конец одного фрагмента, а байт после новой строки — это начало следующего фрагмента. Итак, вам нужен массив значений begin и end , и вам нужно вычислить эти значения перед запуском потоков. Вы можете использовать ftell после каждого fgets , чтобы увидеть, дошли ли вы до конца.

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

Ответ №1:

Проблема … здесь несколько проблем:

 while(fgets(line,sizeof line,fileRead)!= NULL)
{
    total  = total   line;
}
  

Во-первых, вы пытаетесь использовать char *line в качестве числа. Это не сработает. В отличие от языков более высокого уровня, C не преобразует строку в число. Вам нужно сделать это явно, обычно с помощью atoi(line) .

Ваш компилятор C должен был предупредить вас о несоответствии типов, которое предполагает, что вы не работаете с включенными предупреждениями. Большинство компиляторов C не будут иметь предупреждений по умолчанию, вам нужно их включить. Обычно это происходит с помощью -Wall like cc -Wall -g test.c -o test .

Далее, total = total line; означает total = total total line , и это, вероятно, не то, что вы имели в виду (и если это так, вам следует записать это от руки, чтобы было понятно). Я полагаю, вы имели в виду total = line .


Соединяем их вместе…

 while(fgets(line, sizeof(line), fileRead)!= NULL) {
    total  = atoi(line);
}