#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);
}