26317 次
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.txt
2) 名前にピリオドを含むような変数名は使用しません。
'I'
3)変数ではなく定数を意味していたと思いますI
4) 可能な限りいつでもどこでもエラーをチェックする必要があります ( fopen
、fscanf
など)。
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 に答える