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 петля.

Другие вопросы по тегам