質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

1回答

1497閲覧

急募 なぜWindows上では動かないのか

退会済みユーザー

退会済みユーザー

総合スコア0

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2020/06/30 15:25

前提・実現したいこと

パスワード変更プログラムです。macのターミナル上では正常に動くプログラムがWindowsのvscode上では以下のエラーになります。 fpos_t=8 のところで「型が違う」と出るらしいのですが、他に改善法がわかりません。

発生している問題・エラーメッセージ

incompatible types when assigning to type ‘fpos_t {aka struct <anonymous>}’ from type ‘int’

該当のソースコード

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> int main(){ int32_t kanrisyaID; char filename[]="database.txt"; FILE *fp; fpos_t fpos; char pass[9]; char current_ps[9]; char new_ps[9]; fp = fopen(filename,"r+"); if(fp == NULL){ puts("データベースへのアクセスに失敗しました。管理者にご連絡ください"); return -1; } fscanf(fp,"%d",&kanrisyaID); fscanf(fp,"%s",pass); while(1){ printf("現在のパスワードを入力してください>"); scanf("%s",current_ps); if(strcmp(pass,current_ps)==0){ break; } else{ printf("パスワードが違います。\n"); } } while(1){ printf("新しいパスワードを入力してください>(半角英数字8文字)"); scanf("%s",new_ps); if(strlen(new_ps)==8){ break; } else{ printf("もう一度入力をお願いします。\n"); } } printf("新しいパスワードは%sとなりました。\n",new_ps); strcpy(current_ps,new_ps); fpos = 8; fsetpos(fp,&fpos); fprintf(fp,"\t%s",new_ps); fclose(fp); return 0; }

試したこと

ubuntuでの実行(同じく失敗)
'8'という具体的な値からstrlen(8文字の文字列)に変更(意味なし)

補足情報(FW/ツールのバージョンなど)

初心者のため、できれば改善案が欲しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/06/30 15:49

fsetpos(fp,&fpos);は何のためにしているのですか?
退会済みユーザー

退会済みユーザー

2020/06/30 15:55

返信ありがとうございます。ここに記述し忘れてしまったのですが、変更したパスワードをテキストファイルに書きこむのですが、そのテキストファイルは 8桁のID(文字列) 8文字のパスワード(文字列) としているため、パスワードの上書きのため8文字分ずらす処理をしています。
guest

回答1

0

WindowsでどのC言語処理系を使っているのか書いてありませんが、database.txtの先頭からオフセット 8 の位置に文字列(タブとパスワードの平文)を書きこみたいのですよね。

fsetposは、fgetposで得られたファイルの位置情報(file position indicator)を使って設定するという使い方なので、fpos_tが整数値と互換性があることを期待して直接fpos_tに整数値を設定してはいけません。利用しようとしたC言語処理系では、エラーメッセージから察するにfpos_tが構造体になっていて、整数値を設定できていませんね。

参考 FIO44-C. fsetpos() には fgetpos() が返す値を使用する

解決策ですが、fsetposfpos_tのことは忘れて、オフセットをバイト数で指定するfseekを使ってください。ファイル先頭から

C

1fseek(fp, 8, SEEK_SET);

とすれば、期待した結果が得られるはずです。

その上で言いますけど、これを実用に使うのはやめてくださいね。

投稿2020/06/30 16:02

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問