大約 5 年前,我正試圖從涉足 C 中重新學習 C。具體來說,我正在嘗試學習如何從 main 中提取一些操作并將它們變成一個函式,以便接下來將它們移動到一個庫檔案中。
這似乎有效:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *fp;
fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
char word[60];
fgets (word, sizeof(word), fp);
printf("Word is %s\n", word);
}
順便說一句,“虛擬”是:
$ cat dummy
dog
cat
$
無論我如何嘗試,它要么給我編譯錯誤,要么在我運行它時出現段錯誤:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
void getfile(FILE *fp) {
fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *fp;
getfile(fp);
char word[60];
fgets (word, sizeof(word), fp);
printf("Word is %s\n", word);
}
我嘗試從 *fp 更改為 fp 到 &fp 沒有成功。我確定我對檔案指標有些不理解,但無法弄清楚。
感謝您的任何幫助和建議。
-凱文
uj5u.com熱心網友回復:
你有兩個選擇
首先,讓'getfile'回傳檔案句柄(這是c中最慣用的方式)
FILE *getfile() {
FILE *fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
return fp;
}
主要是
FILE *fp = getfile(fp);
或者讓 getfile 更新 fp 值,使用 c 風格的“通過參考”
void getfile(FILE **fp) {
*fp = fopen(arguments.word_file, "r");
if (*fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
主要是
File *fp = NULL;
getfile(&fp);
uj5u.com熱心網友回復:
fp不應該是 的引數getfile(),它應該是回傳值。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
struct arguments {
char *word_file; /* Default name for input file */
} arguments;
FILE *getfile() {
FILE *fp = fopen(arguments.word_file, "r");
if (fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
return fp;
}
int main (int argc, char *argv[]) {
arguments.word_file = "dummy";
FILE *file_ptr;
file_ptr = getfile();
char word[60];
fgets (word, sizeof(word), file_ptr);
printf("Word is %s\n", word);
}
如果出于某種原因您確實需要將其作為引數傳遞,請參閱使用函式更改指標包含的地址
uj5u.com熱心網友回復:
問題是指標fp是按值傳遞給函式getfile的。
getfile(fp);
那就是該函式處理傳遞的指標值的副本fp。所以在函式中更改副本并不會反映原始指標的值。
您需要通過參考傳遞指標。
在 C 中,通過參考傳遞意味著通過指向物件的指標間接傳遞物件。取消參考指標,您可以直接訪問原始物件。
所以宣告并定義函式
void getfile(FILE **fp) {
*fp = fopen(arguments.word_file, "r");
if ( *fp == NULL) { /* If fopen failed... */
fprintf(stderr, "Error: Unable to open file %s: %s\n",
arguments.word_file, strerror (errno));
exit (8);
}
}
并呼叫函式
getfile(&fp);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456456.html
上一篇:C程式查找給定數量的面額數量
