2013-10-10 1 views
0

Я только что начал изучать C немного назад, и мне нужна помощь с конкретной программой. Мне нужно прочитать строки из файла (около 50 байт за раз) и скопировать их в новый файл, включая двоичные файлы. Это довольно просто, но у меня возникают проблемы с тем, как именно я должен это делать. До сих пор у меня естьСкопируйте файлы ввода, двоичные и ASCII-файлы в новый файл

while () { 
    read (infile, buffer, 50); 
    if (r< 0) { 
      perror("cannot read infile"); 
      exit (-1); 
    } 
    if (r==0) { 
      break; 
    } 
    write (outfile, buffer, r); 
    } 

пока я уже открываю и закрываю файлы, которые мне понадобятся. Цикл должен читать файл по 50 байт за раз и записывать их в новый файл, но я не уверен, каково должно быть условие цикла while. Я думал, возможно, взяв количество байтов в файле и сделаю так, чтобы он прокручивал файл, если осталось больше байтов. Однако я не совсем уверен, как это сделать. Любая помощь в правильном направлении?

+2

как вы открыть файл? – SheetJS

+1

Фактически вы должны открыть файл в двоичном режиме, чтобы получить результат, который вы после – EvilTeach

ответ

2

Вы должны захватить возвращаемое значение read:

r = read (infile, buffer, 50); 

Учитывая то, как петля установлен, вы можете использовать всегда-истинное состояние: while(1) (так как вы уже ломаться, когда вы дойдете до конца файл)

2
while (1) { 
    int r = read (infile, buffer, 50); 
    if (r< 0) { 
      perror("cannot read infile"); 
      exit (-1); 
    } 
    if (r==0) { 
      break; 
    } 
    if(write (outfile, buffer, r) != r) 
      printf("write error\n"); 
} 
0

Во-первых, вы можете изменить (г == 0) к (г < 50), так как последняя строка, вероятно, не будет целых 50 байт. Если это так, следующий пробег будет равен 0, что будет по-прежнему оценено как true. И вы никогда не захватываете r как возвращаемое значение из read().

Для вашего фактического вопроса вы можете сделать это различными способами. В настоящее время вы можете написать

while(1){ 

    r = read(infile, buffer, 50); 

    if (r < 50) { 
    ... 
    break; 
    } 
} 

будет работать нормально. Оператор break выйдет из цикла, когда условие r < 50 выполнено, подразумевая, что байты не были прочитаны.

Для кода, который является более ясным и удобным для чтения, вы могли бы использовать Int как логическое значение, как это:

int FileDone = 0; 
while(!FileDone){   
    ... 
    if (r < 50) { 
     FileDone = 1 
    } 
} 

или, может быть, как это:

int r = 1; 
while (r > 0){ 

    r = read(infile, buffer, 50); 

    if (r < 0) { 
     perror("cannot read infile"); 
     exit (-1); 
    } 

    write (outfile, buffer, r); 
} 
Смежные вопросы