как объединить две строки в цикле C - PullRequest
0 голосов
/ 15 октября 2019

Я использую два файла txt ("names.txt", "fixes.txt") и мне нужно построчно читать слова этих файлов и объединять их в новый файл ("results.txt"),например, файл имен содержит это:

john
william
brad

и файл исправлений содержит это:

@123
@321
@qwe

код здесь:

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

int main(int argc, char *argv[])
{
    char * filename = argv[1];
    char * fixname = argv[2];
    char names[100];
    char fixes[100];
    FILE * fptr = fopen(filename, "r");
    FILE * fpt = fopen(fixname, "r");
    FILE * fp = fopen("results.txt", "w");
    while (fgets ( names, sizeof(names), fptr ) != NULL)
    {
        strtok(names, "\n");
        while(fgets ( fixes, sizeof(fixes), fpt ) != NULL)
        {
            fprintf(fp, "%s%s", names, fixes);
        }
    }

    return 0;
}

я хочу результатыкак это:

john@123
john@321
john@qwe
william@123
william@321
william@qwe
(and go on)

НО, результат такой:

john@123
john@321
john@qwe

он не получит другие имена!

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Как указал Влад, внутренний цикл указывает на EOF после первой итерации внешнего цикла. Следовательно, в последующих итерациях внешнего цикла пропустите внутренний цикл.

Чтобы это исправить, вы можете возвращать указатель «fpt» в начало файла после каждой итерации.

while (fgets ( names, sizeof(names), fptr ) != NULL)
{
    strtok(names, "\n");
    while(fgets ( fixes, sizeof(fixes), fpt ) != NULL)
    {
        fprintf(fp,"%s%s", names, fixes);
    }
    fseek(fpt,0,SEEK_SET);//bring fpt back to the beginning of the stream
}
0 голосов
/ 15 октября 2019

В первой итерации внешнего цикла while внутренний цикл while генерирует условие EOF входного файла fixname.

Таким образом, другие итерации внешнего цикла while пропускают оценку внутреннего цикла while. потому что это условие

while(fgets ( fixes, sizeof(fixes), fpt ) != NULL)
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

равно ложному.

Используйте, например, один внешний цикл while и внутри него используйте оператор if вместо внутреннего цикла while.

...