1
4

3 に答える 3

4

Put the standard headers at file scope, not a block scope:

 #include <stdio.h>

 int main(int argc, char *argv[])
 {
    ...
于 2013-09-22T21:27:47.367 に答える
3

提案された変更:

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE fp_input = NULL;
    FILE fp_ints = NULL;
    FILE fp_chars = NULL;
    FILE fp_floats = NULL;

    char flag;
    int ipint;
    char ipchar;
    float ipfloat;
    int exitStatus;

    if (!(fp_input= fopen("input.txt", "r")) {
      perror ("fp_input failed");
      return 1;
    }

    if (!(fp_ints = fopen("ints.txt" "w")) {
      ...
    if (fscanf(fp_input, "%c", &flag)!= 1) { 
      ...

    while (exitStatus != EOF){
      switch (flag) {
        case 'I' :
          fscanf(fp_input,"%i",&ipint);
          fprintf(fp_ints, "%d", ipint);
          break;
        case 'C' :
          ...
        default :
          ...
    }

言い換えると:

1)#includeが間違った場所にある

input.txt2) 名前にピリオドを含むような変数名は使用しません。

'I'3)変数ではなく定数を意味していたと思いますI

4) 可能な限りいつでもどこでもエラーをチェックする必要があります ( fopenfscanfなど)。

5) フォーマット文字列が必要ですfprintf()

于 2013-09-22T21:35:30.363 に答える
1
  • switch複数ではなくステートメントを使用するif

while (exitStatus != EOF)
{
    switch (flag) {

        case 'I':
            //...
            break;

        case 'C':
            //...
            break;

        case 'F':
            //...
            break;

        default:
            puts("Flag not recognized");
            return EXIT_FAILURE;
        }
}
  • fprintfは と同じでprintf、唯一の違いはユーザーが決定できることですstdout。したがって、文字の書式設定は引き続き必要です。
  • .オブジェクトのメンバーにアクセスするために予約されているため、変数名に文字を含めることはできません
  • exitStatusプログラムがファイルからの読み取りをいつ停止するかを知ることができるように、反復ごとに更新する必要があります。fgetcそのためにandを使用しungetcました

このコードは、必要なことを行う必要があります。

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

int main(int argc, char *argv[])
{
    FILE *input = fopen("input.txt", "r");
    FILE *ints = fopen("ints.txt", "w+");
    FILE *chars = fopen("chars.txt", "w+");
    FILE *floats = fopen("floats.txt", "w+");

    int flag, ipint, exitStatus;
    char ipchar;
    float ipfloat;

    if (NULL == input) {
        perror("File not found [input.txt]");
        return EXIT_FAILURE;
    }

    while ((exitStatus = fgetc(input)) != EOF && ungetc(exitStatus, input))
    {
        fscanf(input, "%d", &flag);
        switch (flag) {

            case 'I':
                fscanf(input, "%i", &ipint);
                fprintf(ints, "%i", ipint);
                break;

            case 'C':
                fscanf(input, "%c", &ipchar);
                fprintf(chars, "%c", ipchar);

                break;

            case 'F':
                fscanf(input, "%f", &ipfloat);
                fprintf(floats, "%f", ipfloat);
                break;

            default:
                puts("Flag not recognized");
                fclose(input);
                fclose(ints);
                fclose(floats);
                fclose(chars);
                return EXIT_FAILURE;
        }

    }
    fclose(input);
    fclose(ints);
    fclose(floats);
    fclose(chars);

    return EXIT_SUCCESS;
}
于 2013-09-22T21:35:16.570 に答える