#10
by かずま » 5年前
べけん さんが書きました: ↑5年前
3.txt以降の処理がうまくいかなかった原因についてですがおそらく一つ一つのファイルの分量が大きくchar arr[]の範囲が足らなかったのが影響していたようでした。
おそらくなどと言わずに、3.txt のサイズ、行数、行内の文字数の最大値を調べてください。
べけん さんが書きました: ↑5年前
しかし、テキストファイルは30近くあるのですがchar arr[]の[]内を100000といったかなり大きな値に変更したところ処理がされませんでした。
arr は main のローカル変数で自動変数なので、確保できるサイズが限られます。
static char arr[100000][500]; のように static を付けて静的に確保するか、
関数の外側でグローバル変数として宣言し、静的に確保するようにしてみてください。
べけん さんが書きました: ↑5年前
ほかの型で置き換えるなどしてこの上限以上にすることなどは可能でしょうか?
必要な領域を動的に確保すればよいでしょう。
ちょっと書いてみました。
コード:
#include <stdio.h> // fopen, fclose, fgetc, fread, fwrite,
// fgetpos, fputpos, fseek, sprintf, perror
#include <stdlib.h> // malloc, free
#define NFILE 3 // 1.txt~3.txt
#define LINE 18
int main(void)
{
for (int i = 1; i <= NFILE; i++) {
char path[256];
sprintf(path, "%d.txt", i);
FILE *fp = fopen(path, "rb");
if (!fp) { perror(path); return 1; }
fpos_t p0, p1;
fseek(fp, 0, SEEK_END); // 読み込み位置を最後に移動
fgetpos(fp, &p1); // 最後の位置を取得
rewind(fp); // 読み込み位置を先頭に移動
int c, n = 0;
while ((c = fgetc(fp)) != EOF)
if (c == '\n' && ++n == LINE) break;
fgetpos(fp, &p0); // 指定行数読み込み後の位置を取得
size_t len = p1 - p0; // 先頭部分削除後のサイズ
char *buf = malloc(len); // C++ なら char *buf = new char[len];
if (!buf) { perror("malloc"); return 2; }
fread(buf, 1, len, fp);
fclose(fp);
fp = fopen(path, "wb");
if (!fp) { perror(path); return 3; }
fwrite(buf, 1, len, fp);
fclose(fp);
free(buf); // C++ なら delete[] buf;
}
return 0;
}
[quote=べけん post_id=153008 time=1551676243 user_id=2835]
3.txt以降の処理がうまくいかなかった原因についてですがおそらく一つ一つのファイルの分量が大きくchar arr[]の範囲が足らなかったのが影響していたようでした。
[/quote]
おそらくなどと言わずに、3.txt のサイズ、行数、行内の文字数の最大値を調べてください。
[quote=べけん post_id=153008 time=1551676243 user_id=2835]
しかし、テキストファイルは30近くあるのですがchar arr[]の[]内を100000といったかなり大きな値に変更したところ処理がされませんでした。
[/quote]
arr は main のローカル変数で自動変数なので、確保できるサイズが限られます。
static char arr[100000][500]; のように static を付けて静的に確保するか、
関数の外側でグローバル変数として宣言し、静的に確保するようにしてみてください。
[quote=べけん post_id=153008 time=1551676243 user_id=2835]
ほかの型で置き換えるなどしてこの上限以上にすることなどは可能でしょうか?
[/quote]
必要な領域を動的に確保すればよいでしょう。
ちょっと書いてみました。
[code]
#include <stdio.h> // fopen, fclose, fgetc, fread, fwrite,
// fgetpos, fputpos, fseek, sprintf, perror
#include <stdlib.h> // malloc, free
#define NFILE 3 // 1.txt~3.txt
#define LINE 18
int main(void)
{
for (int i = 1; i <= NFILE; i++) {
char path[256];
sprintf(path, "%d.txt", i);
FILE *fp = fopen(path, "rb");
if (!fp) { perror(path); return 1; }
fpos_t p0, p1;
fseek(fp, 0, SEEK_END); // 読み込み位置を最後に移動
fgetpos(fp, &p1); // 最後の位置を取得
rewind(fp); // 読み込み位置を先頭に移動
int c, n = 0;
while ((c = fgetc(fp)) != EOF)
if (c == '\n' && ++n == LINE) break;
fgetpos(fp, &p0); // 指定行数読み込み後の位置を取得
size_t len = p1 - p0; // 先頭部分削除後のサイズ
char *buf = malloc(len); // C++ なら char *buf = new char[len];
if (!buf) { perror("malloc"); return 2; }
fread(buf, 1, len, fp);
fclose(fp);
fp = fopen(path, "wb");
if (!fp) { perror(path); return 3; }
fwrite(buf, 1, len, fp);
fclose(fp);
free(buf); // C++ なら delete[] buf;
}
return 0;
}
[/code]