二つのファイルから文字列を読み込み、それを１ファイルの１行目、２ファイルの１行目、１ファイルの２行目、２ファイルの２行目と交互に新しいファイルに出力したいのですが、  
自分の頭の中では文字列配列を３つ用意し、１つ目に１つ目のファイルから

```

    #include <stdio.h>
    
    int main(void) {
        FILE* fp1, * fp2, * fp3;
        fp1 = fopen("1.txt", "r");
        fp2 = fopen("2.txt", "r");
        fp3 = fopen("4.txt", "w");
    
        int i = 0, j = 0;
        int n=0, m=0;
        char s[20][20];
        char t[20][20];
        char st[20][20];
    
        while (fscanf(fp1, "%s", s[i][20]) != NULL) {
            st[2 * i][20] = s[i][20];
            i++;
        }
    
        while (fscanf(fp2, "%s", t[j][20]) != NULL) {
            st[2 * (1 + j)][20] = t[j][20];
            j++;
        }
    
        while (st[n][20] != NULL) {
            fprintf(fp3, "%s\n", st[n][20]);
            n++;
        }
    
        printf("出力しました");
    
        fclose(fp1);
        fclose(fp2);
        fclose(fp3);
        return 0;
    }
    
```
CC BY-SA 4.0
2019-08-05T04:51:51.653
57174
2019-08-07T10:22:34.293
2019-08-05T04:57:20.967
3060
35366
question
c++
二つのファイルから文字列を読み込み、それを１ファイルの１行目、２ファイルの１行目、１ファイルの２行目、２ファイルの２行目と交互に新しいファイルに出力したい
* 文字列は[`std::string`](https://ja.cppreference.com/w/cpp/string/basic_string)
  * ファイル読み込みは[`std::ifstream`](https://ja.cppreference.com/w/cpp/io/basic_ifstream)、書き出しは[`std::ofstream`](https://ja.cppreference.com/w/cpp/io/basic_ofstream)
  * １行読み込みは[`std::getline`](https://ja.cppreference.com/w/cpp/string/basic_string/getline)
  * 任意の書き込みは[`operator<<`](https://ja.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt)、行末記号は[`std::endl`](https://ja.cppreference.com/w/cpp/io/manip/endl)
  * ストリームオブジェクトは[`bool`評価](https://ja.cppreference.com/w/cpp/io/basic_ios/operator_bool)を行うとエラーが発生していないか判定できる、つまり、まだ読み出し可能か判定できる
  * ストリームオブジェクトは使い終えると自動的に閉じられる

辺りを組み込むと

```

    #include <fstream>
    #include <iostream>
    #include <string>
    
    int main() {
        std::ifstream f1{ "1.txt" }, f2{ "2.txt" };
        std::ofstream f3{ "4.txt" };
        for (std::string line; f1 || f2;) {
            if (f1 && getline(f1, line))
                f3 << line << std::endl;
            if (f2 && getline(f2, line))
                f3 << line << std::endl;
        }
    }
    
```

ぐらいでしょうか。
CC BY-SA 4.0
2019-08-05T06:34:16.803
57175
2019-08-05T06:34:16.803
4236
57174
answer
もしC++ではなくCの範囲で行いたいのなら次のようになると思います。

`fgets`でバッファ
(`buf`)に一行読み込み、成功した場合はその文字列を返します。ファイル終端などで読み取れなかった場合は`NULL`を返します。改行文字もバッファに格納されます。  
<http://www.c-tipsref.com/reference/stdio/fgets.html>

`fputs`で文字列を書き込みます。  
<http://www.c-tipsref.com/reference/stdio/fputs.html>

```

    #include <stdio.h>
    
    int main()
    {
        FILE *fp1, *fp2, *fp3;
    
        const int BUF_SIZE = 20;
        char buf[BUF_SIZE];
    
        char *sz1, *sz2;
    
        fp1 = fopen("1.txt", "r");
        fp2 = fopen("2.txt", "r");
        fp3 = fopen("4.txt", "w");
    
    
        while (true)
        {
            sz1 = fgets(buf, BUF_SIZE, fp1);
            if (sz1 != NULL) {
                fputs(sz1, fp3);
            }
            sz2 = fgets(buf, BUF_SIZE, fp2);
            if (sz2 != NULL) {
                fputs(sz2, fp3);
            }
            if (sz1 == NULL && sz2 == NULL) {
                break;
            }
        }
    
        fclose(fp1);
        fclose(fp2);
        fclose(fp3);
    
        return 0;
    }
    
    
    
```

なおこのコードはエラー処理を行っていません。  
また、19バイト以上の行があると意図しない結果になります。

C++をフルに使えるのならば sayuri さんの回答を参考にしてください。一行の長さに制限はありませんし、エラー時も安心です。
CC BY-SA 4.0
2019-08-07T10:22:34.293
57220
2019-08-07T10:22:34.293
20885
57174
answer