この日、私はその問題に関連するいくつかの質問を投稿しました。それだけ今、私は本当に面白いものを手に入れました。
私のコードを見てください:
#include <libpq-fe.h>
#include <stdlib.h>
#include <string.h>
#define LINE_SIZE 100
PGconn *connect(char *);
int main()
{
connect("/path/to/file.props");
return 0;
}
PGconn *connect(char *file_path)
{
const char **keywords;
const char **values;
char *line = malloc(LINE_SIZE);
char *prop, *val, *tmp;
int i = 0, j = 0, k = 0;
PGconn *conn = NULL;
FILE *creds = fopen(file_path, "r");
if (creds == NULL) {
perror("error: cannot open credentials file"); //!!! warning
exit(1);
}
keywords = malloc(6 * sizeof(char *));
values = malloc(6 * sizeof(char *));
while (fgets(line, LINE_SIZE, creds) != NULL) {
if (line[strlen(line) - 1] == '\n')
line[strlen(line) - 1] = '\0';
prop = line;
while(*(prop++) != '=') {
i++;
}
tmp = prop;
prop = malloc(i + 1);
strncpy(prop, line, i);
prop[i] = '\0';
keywords[j++] = prop;
val = malloc(strlen(line) - strlen(prop) + 1);
strcpy(val, tmp);
values[k++] = val;
i = 0;
}
keywords[j] = NULL;
values[k] = NULL;
printf("%s %s %s %s %s\n", keywords[0], keywords[1], keywords[2], keywords[3], keywords[4]);
printf("%s %s %s %s %s\n", values[0], values[1], values[2], values[3], values[4]); //prints well
conn = PQconnectdbParams(keywords, values, 0);
if (PQstatus(conn) != CONNECTION_OK) {
fprintf(stderr, "%s\n", PQerrorMessage(conn));
exit(1);
}
return conn;
}
実行すると、次の出力が得られます。
hostaddrポートユーザーパスワードdbname
127.0.0.1 5432 my_user my_password my_db
エラー:クレデンシャルファイルを開くことができません:不正なアドレス
ご覧のとおり、ファイルの内容が印刷され、その内容が印刷された後にのみ、上記のエラー(「警告」コメントの行から)がそのファイルを読み取ることができないように印刷されます。
ここで何が起こるかについて何か考えがありますか?