#6
by かずま » 6年前
m3908714035 さんが書きました: ↑6年前
コード:
receiver >> data[i]; // ファイル内文字列を保管
これでは、ファイル中の単語(空白を含まない文字列)を 1個しか
読み込めません。ファイル内の文字全部を取得したければ、
data[ i] = receiver.str(); としたほうが良いのではありませんか?
Cプログラムで、ファイルの内容をすべてメモリに読み込みたければ、
次のように書けます。
コード:
#include <stdio.h> // sprintf, printf, fopen, fclose, fseek, rewind, fread, puts
#include <stdlib.h> // srand, rand, malloc, free
#include <time.h> // time
#define N 100
int main(void)
{
int a[N], i, k = 0;
char *data[N];
srand(time(0));
for (i = 0; i < N; i++) a[i] = i + 1;
while (i > 0) {
char name[16];
int j = rand() % i;
sprintf(name, "%d.txt", a[j]);
a[j] = a[--i];
FILE *fp = fopen(name, "r");
if (!fp) { printf("can't open %s\n", name); return 1; }
//printf("=== %s ===\n", name);
fseek(fp, 0, SEEK_END);
long n = ftell(fp);
rewind(fp);
data[k] = malloc(n + 1);
if (!data[k]) return 2;
n = fread(data[k], 1, n, fp);
data[k++][n] = '\0';
fclose(fp);
}
for (i = 0; i < N; i++) puts(data[i]);
for (i = 0; i < N; i++) free(data[i]);
}
ただし、Windows では、ファイル中の改行は '\r' '\n' の 2文字であり、
fread がこれを '\n' 1文字に変換するので、fread で n の値は
行数分少なくなります。
[quote=m3908714035 post_id=152343 time=1545905770 user_id=2801]
[code]
receiver >> data[i]; // ファイル内文字列を保管
[/code]
これでは、ファイル中の単語(空白を含まない文字列)を 1個しか
読み込めません。ファイル内の文字全部を取得したければ、
data[ i] = receiver.str(); としたほうが良いのではありませんか?
Cプログラムで、ファイルの内容をすべてメモリに読み込みたければ、
次のように書けます。
[code]
#include <stdio.h> // sprintf, printf, fopen, fclose, fseek, rewind, fread, puts
#include <stdlib.h> // srand, rand, malloc, free
#include <time.h> // time
#define N 100
int main(void)
{
int a[N], i, k = 0;
char *data[N];
srand(time(0));
for (i = 0; i < N; i++) a[i] = i + 1;
while (i > 0) {
char name[16];
int j = rand() % i;
sprintf(name, "%d.txt", a[j]);
a[j] = a[--i];
FILE *fp = fopen(name, "r");
if (!fp) { printf("can't open %s\n", name); return 1; }
//printf("=== %s ===\n", name);
fseek(fp, 0, SEEK_END);
long n = ftell(fp);
rewind(fp);
data[k] = malloc(n + 1);
if (!data[k]) return 2;
n = fread(data[k], 1, n, fp);
data[k++][n] = '\0';
fclose(fp);
}
for (i = 0; i < N; i++) puts(data[i]);
for (i = 0; i < N; i++) free(data[i]);
}
[/code]
ただし、Windows では、ファイル中の改行は '\r' '\n' の 2文字であり、
fread がこれを '\n' 1文字に変換するので、fread で n の値は
行数分少なくなります。