Работа с текстовыми файлами два - PullRequest
0 голосов
/ 28 декабря 2011

Несколько вопросов о коде ниже, из которого я получил помощь в предыдущем посте.

1).Любые идеи, почему в конце вывода я напечатал случайный символ мусора?Я освобождаю файлы и т. Д. И проверяю EOF.

2).Идея состоит в том, что он может работать с несколькими аргументами файлов, поэтому я хочу создать новые имена файлов, которые увеличиваются, то есть выходят из [i] .txt, возможно ли это в C?

Сам код принимает файл, содержащий слова, разделенные пробелами, например, книгу, затем перебирает и заменяет каждый пробел на \ n, так что он образует список, пожалуйста, найдите код ниже:

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

/*
 * 
 */
int main(int argc, char** argv) {

FILE *fpIn, *fpOut;
int i;
char c;
while(argc--) {
    for(i = 1; i <= argc; i++) {
        fpIn = fopen(argv[i], "rb");
        fpOut= fopen("tmp.out", "wb");
        while (c != EOF) {
            c = fgetc(fpIn);
            if (isspace(c)) 
                c = '\n';
            fputc(c, fpOut );
        }
    }
}
fclose(fpIn);
fclose(fpOut);
return 0;
}

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Когда вы достигаете конца файла, вы не break цикл. Таким образом, вы вызываете fputc(c, fpOut); с c==EOF, что, вероятно, является неопределенным поведением, или, по крайней мере, запись байта \0xff.

И вы не вызываете fclose в вашем цикле while(argc--), поэтому ваши файлы (кроме последних) в большинстве случаев никогда не закрываются и не сбрасываются.

Наконец, вы не проверяете результат fopen и вам следует проверить, что он не равен нулю (и напечатать сообщение об ошибке, возможно, с чем-то вроде strerror(errno) или perror, в этом случае).

Вы должны были выяснить это с помощью отладчика (например, gdb в Linux) и, возможно, с помощью предупреждений компилятора (но gcc-4.6 -Wall не обнаружил никаких ошибок в вашем примере).

Вы можете решить, что имя выходного файла связано с именем входного файла, возможно, с

char outname[512];
for(i = 1; i < argc; i++) {
   fpIn = fopen(argv[i], "rb");
   if (!fpIn) { perror (argv[i]); exit(1); };
   memset (outname, 0, sizeof (outname));
   snprintf (outname, sizeof(outname)-1, "%s~%d.out", argv[i], i);
   fpOut= fopen(outname, "wb");
   if (!fpOut) { perror (outname); exit(1); };
   /// etc...
   fclose(fpIn);
   fclose(fpOut);
   fpIn = fpOut = NULL;
}
1 голос
/ 28 декабря 2011

Предлагаемые изменения (все не проверено):

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

int 
main(int argc, char** argv) {

  FILE *fpIn, *fpOut;
  int i;
  char c;
  for(i = 1; i < argc; i++) {
    fpIn = fopen(argv[i], "rb");
    if (!fpIn) {
      perror ("Unable to open input file");
      continue;
     }
    fpOut= fopen("tmp.out", "wb");
    if (!fpOut) {
      perror ("Unable to open output file");
      fclose (fpIn);
      continue;
     }
     while ((c = fgetc (fpIn)) != EOF)) {
       if (isspace(c)) 
         c = '\n';
       fputc(c, fpOut );
     }
     fclose(fpIn);
     fclose(fpOut);
  }
  return 0;
}
...