ここから質問投稿すると、最大4000ポイント当たる!!!! >>

c言語初心者です。
forループをつかって、
ファイルから空白で区切られた数字を一つずつ読み込む
プログラムを作りたいのですが、
forループの中をどう書いたらいいかわかりません。

#include <stdio.h>

int main (int argc, char *argv[])
{
char *fileName = argv[1];

FILE *fp = fopen("fileName", "r");

int num;
int i;

for(i=0; i<10; i++){
fscanf(fp, "%d", &num);
printf("%d\n", num);
}
fclose(fp);
}

ファイルの内容は、10個の数字が書かれている設定です。

A 回答 (1件)

FILE *fp = fopen("fileName", "r");


は、
FILE *fp = fopen(fileName, "r");
でしょうね。
他はいいと思いますが。

細かいことを言うと、argv[1] を参照する前に、argcの値をチェックすべき。
    • good
    • 1
この回答へのお礼

初歩的なミスでした。。
ご指摘ありがとうございます!

お礼日時:2015/04/15 21:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qテキストファイルから文字列を読み込んで二次元配列に格納するには

毎回お世話になっています。

ただいまC言語を勉強中の学生です。

基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので

どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。

今回練習しているのは 先に述べたように、テキストファイルに

abc
def
ghi
jkl

などと文字列を書いておき、そのファイルを読み込んで
二次元配列に格納したいのですが、何を勘違いしているのか、
うまく実現できません。

参考書などを見て 一次元配列へ格納する場合は できたようなのですが、今後このプログラムを発展させる段階で 二次元配列に文字列を
格納できたほうが好都合なので 今模索しています。。。

ちなみに 一次元配列に格納する場合は 以下のように書きました。


#include<stdio.h>
#include<stdlib.h>

main()
{
char a[10];

FILE *fp;

fp = fopen("word.dat", "r");

if (fp == NULL)
{
printf("File does not exist.\n");
exit(1);
}

while(fscanf(fp,"%s",a)==1){
printf("%s\n",a);
}

fclose(fp);

return 0;
}

実はコレに関しても分からない点があり、それは 目的の配列変数
a[]に格納できたのだから それを確認したいと思い
printfで a[0]~a[10]を表示してみようとしたところ 変に文字化け
したものが表示されたり、何も表示されなかったり よく分からないことが起きます。私は何を勘違いしてしまっているのでしょうか(>_<)

長々と書いてしまいましたが、今回 御教授いただきたいのは

(1)、テキストファイルから 英字の文字列を読み込んで二次元配列に格納するために用いるのに 一番最適な関数はどれか(fscanfやfgetsなど) そして、その関数を使って 一番シンプルな記述をするにはどのように記述すればよいのか

(2)、上のようなプログラムの書き方で、配列aにテキストファイルから読み込んで格納できたようなのに、a[0]~a[10]をprintfしたときに
うまく中身が表示されないのはなぜか。

という点なのですが、(1)をとりあえず急いでおりますので、(2)はおまけ程度に考えていただければと思います。

なぜかファイルの入出力がいまだに把握できなくて苦手としておりますので、どうか よろしくお願いいたします。

毎回お世話になっています。

ただいまC言語を勉強中の学生です。

基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので

どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。

今回練習しているのは 先に述べたように、テキストファイルに

abc
def
ghi
jkl

などと文字列を書いておき、そのファイルを読み込んで
二次元配列に格納したいのですが、何を勘違いしているのか、
うまく実現...続きを読む

Aベストアンサー

#include <stdio.h>
int
main(void)
{
char a[10][10];
int i, maxi;
FILE *fin;

if ((fin = fopen("test.dat", "r")) == NULL){
fprintf(stderr, "Can't open file\n");
}
for (i = 0; i<10; i++) {
if (fgets(a[i], 10, fin) == 0) {
maxi = i;
break;
}
}
for (i = 0; i < maxi; i++) {
printf("a[%d] = %s", i, a[i]);
}

fclose(fin);
return 0;
}

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qscanf("%s", buf);でスペースを含んだ文字

コンソールプログラムで
scanf("%s", buf);
を使用してユーザに入力された文字によって処理を行いたいのですが、このままではスペースを含む文字列がスペースの手前で切られてしまいます。
C:\Program Filesなどを入力可能にさせたい場合にはどのようにするのがベターですか?

Aベストアンサー

お任せください!
そもそもscanfを使うというのはお勧めでは
ありません。scanfは文字+改行文字が入力
されないと完了しないためです。
が、それは良しとしましょう。
scanfの書式ですが、

int n = scanf("%[^\r\n]",buf);

という便利な書式があります。
perlでもおなじみの書式ですね。
上記の山文字"^"より前が読み込ませたい文字の集まりで、ハイフン指定が出来ます。
"^"より後ろが読込みを停止させたい文字の集まりです。上記の指定は復帰改行以外の文字が現れるまで読み込みます、という書式です。
下記のような指定も出来ます。

int n = scanf("%[a-zA-Z0-9\\: \t^\r\n]",buf);

なお、戻り値は読み込んだ項目数ですので、
if(n >= 1)
{
}
で判断できますね。

Q数字の入った配列をファイルへ出力。

今、hist[256]というint型の配列に数字が入っているとします。
これを、テキストファイルに出力して、

0
242
5654
232
3123
756



こんな感じで、ファイルに出力したいです。

文字としての出力になるのでhist[256]配列を、int型からchar型に変換しないとダメでしょうか?
また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね?
もっと大きい数字も入っているので何とかする方法も教えて下さい。

初歩的な質問で申し訳ありませんが、よろしくお願いします。

Aベストアンサー

fprintf()関数を使えば簡単です。
簡単に言えば、printf()関数のファイル出力版です。
画面ではなく、ファイルに文字列を出力します。

サンプル
------------------------
FILE *fp;
int i;
if((fp = fopen("data.txt", "w")) != NULL){
 for(i = 0; i < 256; i++){
  if(fprintf(fp, "%d\n", hist[i]) < 0){
   //書き込みエラー
   break;
  }
 }
 fclose(fp);
}else{
 //ファイルオープンエラー
}
------------------------

%d で int型の整数を文字として表示、
\n で改行です。printf()関数と同じですね。

#サンプルはインデントに全角スペースを使っています。

-----------------------------------------------------------
>int型からchar型に変換しないとダメでしょうか?
>また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね?

ちょっと勘違いしているようなので、説明しますが・・・

C言語の文字列は、文字の配列です。
char型は1文字を表わします。
文字列は、char型の配列になります。

例えば、整数の 123 を文字列で表現する場合、
文字数は3文字で、終端にヌル文字('\0')が入りますので、
4文字の配列になります。

unsigned char c[] = {'1','2','3','\0'};

一つ一つは文字コード(0~255)ですので、char型で問題ありません。

fprintf()関数を使えば簡単です。
簡単に言えば、printf()関数のファイル出力版です。
画面ではなく、ファイルに文字列を出力します。

サンプル
------------------------
FILE *fp;
int i;
if((fp = fopen("data.txt", "w")) != NULL){
 for(i = 0; i < 256; i++){
  if(fprintf(fp, "%d\n", hist[i]) < 0){
   //書き込みエラー
   break;
  }
 }
 fclose(fp);
}else{
 //ファイルオープンエラー
}
------------------------

%d で int型の整数を文字として表示、
\n で...続きを読む

QC言語で複数列のデータを1列のみ読み込みたい

行m列の任意のデータの処理を行うプログラムで,
列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません.
どのようなコードを書けばいいでしょうか?

自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分)
EOFを使っているためか,行数のiには全データ数が入ってしまいます.


void main (void)
{
FILE* fp;

int i, j;
i=0, j=0;

char FilePath[500];
char Folder[100];
char File[50];

printf("Folder Name:");
scanf("%s",&Folder);

printf("File Name:");
scanf("%s",&File);

sprintf(FilePath,"%s/%s",Folder,File);

if(( fp = fopen (FilePath,"r")) == NULL){
printf("cannot open '%s'\n", FilePath);
exit(1);
} //ここまではうまく動きます


while (fscanf(fp, "%lf", &A[i][0]) != EOF{
i++;
}
while (fscanf(fp, "%lf", &A[0][j]) != EOF){
j++;
}

printf("A[%d][%d]", i, j);
int n, m;              //n,mはこの後for文で使いたいので登場してもらいました
printf("input 'n':");
scanf("%d", &n);
printf("input 'm':");
scanf("%d", &m);

行m列の任意のデータの処理を行うプログラムで,
列ごとの統計を行うためにm列目のデータを取り出したいのですが,うまくいきません.
どのようなコードを書けばいいでしょうか?

自分で作ってみたのは以下のようなプログラムです(ファイルを開いて→m列目の読み込みの部分)
EOFを使っているためか,行数のiには全データ数が入ってしまいます.


void main (void)
{
FILE* fp;

int i, j;
i=0, j=0;

char FilePath[500];
char Folder[100];
char File[50];

printf("Folder Name:");
scanf("%s",&...続きを読む

Aベストアンサー

>どのようなコードを書けばいいでしょうか?

 http://okwave.jp/qa/q7114321.html #3

 読み込み時に配列に格納しないで、
 文字列として1行読み込んでから、(数値化し)配列に格納する例です。

 「m列目のデータ」の前には、m - 1 個の空白があるので、それをカウントし数値化します。
 (ただし、文字列には空白が連続しないこと)

 「実数」を「整数」に、「コンマ」を「空白」に置き換えればよいかと。

 http://www.bohyoh.com/CandCPP/C/Library/fgets.html
 http://www.bohyoh.com/CandCPP/C/Library/atoi.html

Qtxtファイルの文字を配列に格納

ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。
※参考になるページやアドバイスがあれば宜しくお願い致します。

■プログラム
#include <stdio.h>

void main(){
int i;
int data[10];
FILE *fp;
fp = fopen("output.txt","r");
if(fp == NULL){
printf("ファイルが見つかりません。");
}else{
for(i=0;fp != EOF;i++){
data[i] = fgetc( fp );
}
}
}

■output.txt
001 100 猫A 好きな物 ねこまんま
002 200 猫B 好きな物 キャットフード

Aベストアンサー

これで、やりたいこと、できませんかね?
++++++++++++++++++++++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
int i = 0, j = 0;
char temp, data[10][100];
FILE *fp;
fp = fopen("output.txt","r");
/* 初期化 */
memset(data, 0, sizeof(data));

if(fp == NULL){
printf("Cannot find file");
}else{
while((temp = fgetc(fp)) != EOF){
if (temp == ' ' || temp == '\n') {
data[i][j] = '\n';
i++;
j = 0;
} else {
data[i][j] = temp;
j++;
}
}
for (i = 0; i < 10; i++) {
printf("[%d] Output : %s \n", i, data[i]);
}
fclose(fp);
}

return 0;
}
++++++++++++++++++++++

これで、やりたいこと、できませんかね?
++++++++++++++++++++++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
int i = 0, j = 0;
char temp, data[10][100];
FILE *fp;
fp = fopen("output.txt","r");
/* 初期化 */
memset(data, 0, sizeof(data));

if(fp == NULL){
printf("Cannot find file");
}else{
while((temp = fgetc(fp)) != EOF){
if (temp == ' ' || temp == '\n') {
data[i][j] = '\n';
i++;
j = 0;
} else {
data[i][j] = temp;
j++;
}...続きを読む

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Q改行までの一文字ずつのファイル読み込み

こんにちは。
C言語で現在ある入力ファイルを読み込んで計算し、
ファイルを出力するというプログラムを作成中なのですが、
ファイルを読み込む場合に、
改行までの値を一文字ずつ読み込むという作業をさせたいと思っています。
データは、
abc

defgh

ijk

.....

といった感じで入力されており、

while((c = fgetc(fp)) != '\n'){
fscanf(fp, "%c", &q[i]);
}

と書いたのですが、セグメント例外が出て強制終了してしまいます。
初歩的なことで申し訳ないのですが、教えていただきたいと思います。よろしくおねがいします。

Aベストアンサー

(1)fgetc() の時点でもう既に1文字データを読んでいるので、
fscanf() で'再度取得'することはできません。
q[i] には c の値をそのまま代入してください。

(2)i はインクリメントしなくてよいのでしょうか?

(3)行の終端 '\n' を検出して while を抜けた後、
printf 文などでそのまま表示させていませんか?
文字列 q[] の終端にヌル文字を入れる必要があります。
(q[]が予めゼロクリアされているのなら入れる必要はありません)

(4)それと、feof() でファイル終端をチェックしながらやった方がいいです。

オーバーフローを起こさない為に q[] には大きめの配列を確保してください。

char q[1024];
int i = 0, c;

while( !feof( fp ) )
{
  if( ( c = fgetc( fp ) ) == '\n' )
    break;
  q[i++] = c;
}
q[i++] = '0';

みたいな感じ。

(1)fgetc() の時点でもう既に1文字データを読んでいるので、
fscanf() で'再度取得'することはできません。
q[i] には c の値をそのまま代入してください。

(2)i はインクリメントしなくてよいのでしょうか?

(3)行の終端 '\n' を検出して while を抜けた後、
printf 文などでそのまま表示させていませんか?
文字列 q[] の終端にヌル文字を入れる必要があります。
(q[]が予めゼロクリアされているのなら入れる必要はありません)

(4)それと、feof() でファイル終端をチェックしながらやった方が...続きを読む

Qファイルの中身検索と表示

Cでの作成についてなんですが、
fopenでテキストファイルを開き、テキストの中身の
特定文字が含まれている行を新に作ったファイルの中に
書き込みたいんですが、テキストの中身の検索と
抽出方法がいろいろ試してみましたがわかりません。
よろしくお願いします。

Aベストアンサー

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定の文字列を含まれた行を抽出するサンプルを下に載せます。

サンプル:
char buff[ 256 ];
char *find = "検索文字列";
FILE *fp; ←読み込み用
FILE *fo; ←抽出用

省略(fopen×2つ)

while ( fgets(buff,sizeof(buff),fp) != NULL ){
 if ( strstr(buff,find) != NULL ){
  fputs( buff, fo );
 }
}

省略(fclose×2つ)

解説:
・上記のサンプルでは、行単位でテキストの中身を取得して、この文字列から検索文字列(find)が
 含まれるか『strstr()』関数でチェックしています。見つかると『NULL』以外を返します。
・そして、見つかったらば行単位で『fputs』関数で出力しています。
 これで見つかった行だけが、新たに作ったファイルに書き込まれていきます。→抽出です。
・また『strstr()』関数の部分を
 『if ( strchr(buff,'a') != NULL ){ … }』とすると『a』の文字が含まれる行のみを抽出します。
 『if ( strspn(buff,"+-*/") != 0 ){ … }』とすると『+-*/』の文字群が含まれる行のみを抽出します。
 検索する文字とは、1文字、文字群、文字列のどれですか?
・以上。おわり。→上記のを参考にして下さい。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strspn.html,http://www9.plala.or.jp/sgwr-t/c/sec17.html

★文字列の検索関数を使えば良い。
・テキストの中身の検索は、行単位で文字列を取得(fgets)してから、この文字列内に
 検索文字列の有無をチェックします。この有無は文字列から文字列を検索する関数
 『strstr』関数を使うのが便利です。また、文字列から1文字の検索を行う場合は
 『strchr』関数を使います。質問では、特定の文字が含まれている行となっていますが
・検索するのは1文字、文字群、文字列のどれですか?
 これによっていろいろと代わりますよ。処理が…。
・とりあえず文字列から特定...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング