C - Работа с fopen, fclose, fputc и т. Д.
Я наконец-то получил этот код, работающий с одним аргументом в моей командной строке, то есть с одним файлом для работы с ним, хотя я разработал код с концепцией работы с неограниченным количеством файлов. Что он делает, это берет некоторое количество X текстовых файлов, содержащих слова, разделенные пробелами, и заменяет пробелы на \n
таким образом создавая список слов. Хотя он успешно завершает первый аргумент, он просто игнорирует второй.
Другая незначительная проблема, по-видимому, заключается в том, что в конце также выводится какая-то буква мусора, буква Y с двумя точками над ней; Я предполагаю некоторый символ EOF, но я не могу остановить это!
int main(int argc, char** argv) {
FILE *fpIn, *fpOut;
int i, j;
j = 1;
char c;
char myString[256];
printf("%d", argc);
printf("\n");
printf("The following arguments were passed to main(): ");
for(i=1; i<argc; i++) printf("%s ", argv[i]);
printf("\n");
while(argc--) {
for(i = 1; i < argc; i++) {
fpIn = fopen(argv[j], "rb");
snprintf(myString, 256, "%s~[%d]", argv[j], i);
fpOut= fopen(myString, "wb");
while (c != EOF) {
c = fgetc(fpIn);
if (isspace(c))
c = '\n';
fputc(c, fpOut );
}
j++;
}
}
return 0;
}
1 ответ
getchar()
, getc()
а также fgetc()
функции (или макросы) возвращают int
не char
,
Вы должны использовать:
int c;
while ((c = fgetc(fpIn)) != EOF)
{
if (isspace(c))
c = '\n';
fputc(c, fpOut);
}
Думаю об этом; функции должны быть в состоянии вернуть любой действительный char
и EOF (который отличается от любого действительного char
значение. Таким образом, по определению, возвращаемое значение не может быть char
...
Что произойдет, если вы используете char
?
- Ваш исходный код не инициализирован
c
перед тестированием (так что цикл может оборваться рано). - Ваш код не тестировался
c
сразу после чтения EOF (чтобы он мог печатать символ мусора, часто ÿ, LATIN SMALL LETTER Y WITH DIAERESIS, U+00FF). - Если твой
char
тип без знака, вы никогда не увидите EOF. - Если твой
char
Тип подписан, некоторые допустимые символы (часто ÿ снова) будут неверно истолкованы как EOF.
Я все еще не могу заставить его работать на несколько аргументов.
Проблема в том, что у вас есть двойной цикл:
int i, j;
j = 1;
while (argc--)
{
for (i = 1; i < argc; i++)
{
fpIn = fopen(argv[j], "rb");
...process fpIn...
j++;
}
}
Допустим, вы вызываете команду с двумя именами файлов; затем argc == 3
,
После первого раза мимо while
петли, argc == 2
, Вы тогда делаете for
цикл с i
принимая значение 1; Вы открываете argv[1]
(так как j == 1
). Вы обрабатываете этот файл; затем увеличить j
до 2, прежде чем также увеличивая i
Тоже 2. Второй раз во всем for
петли, i
== 2 как и argc
, Итак for
цикл завершается. Цикл while уменьшается argc
снова до 1, но тесты, которые 2 != 0
, Тем не менее for
наборы петель i = 1
а затем заканчивается, потому что i == argc
, while
циклические декременты argc
до 1 и повторяется.
Вы можете использовать while
петля или for
цикл, но вам не нужны оба.
Итак, либо:
for (i = i; i < argc; i++)
{
...process argv[i]...
}
Или же:
while (--argc > 0)
{
...process *++argv...
}
Я бы использовал for
петля.