FILEポインタをパラメータとして複数の関数に渡すときに問題があります。C:パラメータとしてファイルを渡す
私はメインでファイルを開き、そのファイルを関数に渡して、そこにいくつかのものを書き込んでから、その関数から別の関数に渡したいと思っています。メインから最初の関数に問題はありませんが、2番目の関数に渡すとSegmentationフォールトが発生します。私はこれででてるところ
void firstFunction(FILE*);
void secondFunction(FILE*);
int main(void) {
FILE *fp;
if((fp = fopen("test.txt", "ab+")) == 0) {
return 1;
}
firstFunction(fp);
return 0;
}
void firstFunction(FILE *fp) {
fprintf(fp, "test"); /* Works */
secondFunction(fp); /* Causes Segmentation fault */
}
void secondFunction(FILE *fp) {
/* never reaches here */
fprintf(fp, "test2");
}
これはかなりよく説明:
私のコードは次のようになります。私はsecondFunction(* fp)などのさまざまな構文を渡してみましたが、成功しませんでした。
What's going wrong? mainからfirstFunctionへ行くときにはどのように動作しますが、firstからsecondFunctionには移動しませんか?
EDIT:実際のコード
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define LINESIZE 512
void runCommand(const char[], FILE*);
void append(const char[], FILE*);
int main(int argc, char * argv[]) {
char filename[LINESIZE];
FILE *fp;
char line[LINESIZE];
sscanf(argv[1], "%s", filename);
/* Open file for saving data */
if((fp = fopen(filename, "ab+")) == 0) {
perror("fopen");
return 1;
} else {
/* Reads lines from user */
while(fgets(line, LINESIZE, stdin)){
/* Omits empty lines */
if(strlen(line) > 1) {
runCommand(line, fp);
}
}
}
return 0;
}
/* Parses first word in input and executes proper command */
void runCommand(const char input[], FILE *fp) {
char param1[LINESIZE];
fprintf(fp, "test");
append(input, fp);
int r = sscanf(input, "%s", param1);
if (!strcmp(param1, "append")){
append(input, fp);
} else {
/* Error Handling */
}
}
void append(const char input[], FILE *fp) {
char command[7];
char fName[20];
char lName[20];
int score;
int r = sscanf(input, "%s%s%s%d", command, fName, lName, score);
if (r != 4) {
/* Error Handling */
}
fprintf(fp, "%s%s%d", fName, lName, score);
}
これはあなたの実際のコードですか? 5行目の 'FILE * fp'の後にセミコロンを入れずにコンパイルしたり、最初に' #include 'をコンパイルすることはありません。しかし、これらの変更で、私のシステムでコンパイルして正常に動作します。 –
segフォールトを再現できる実際のコードを入力してください。上記のコードにはその結果はありません。 – kaylum
http://stackoverflow.com/help/mcve –