【问题标题】:Reading file line by line, character by character [closed]逐行,逐字符读取文件[关闭]
【发布时间】:2016-05-07 14:01:00
【问题描述】:

我有一个文件,每行有两个未知长度,用空格分隔。这些数字可以是任何大小,最多有 500 个数字,所以我需要逐个字符地读取它并将其存储到一个整数数组中。我尝试过这样的事情:

while(fgets(line, sizeof line, fp) != NULL) { // assuming buff handles the line lenght
//read each character until ''
   // store it
//read each character until '\n'
  // store it
}       

我尝试使用 fgetc 读取直到 ' ' 和 '\n' 但它不起作用。任何建议将不胜感激。

【问题讨论】:

  • 您的代码看起来有点可疑:首先,您有一个语法错误和一个逻辑错误:它应该类似于while(fgets(buff, sizeof(buff), fp) != NULL){ … }。其次,很难进入你必须存储你读过的内容的什么样的数组?整数数组?浮点数组?字符数组?您是否“需要对数字或其十进制表示的数字字符串执行不同的操作”?你的努力会帮助所有人,包括你自己。
  • 感谢指正。目前我将对数组做的事情不太相关。我只是想指出,需要逐行读取,因为我将对每一行的数字进行不同的操作。
  • 为什么不把数字读成doubles?它们可以是“任何大小”...
  • 它们可以有任意位数。例如:300!这就是为什么我试图逐个字符地阅读它。

标签: c file io


【解决方案1】:

你不应该一次读一个字符。相反,一次读一行:

int num1, num2;

while (fscanf(fp, "%d %d\n", &num1, &num2) == 2) {
    // do something with num1 and num2
}

编辑:好的,现在你说这些数字可能非常庞大。没问题,就用libgmphttps://gmplib.org/manual/I_002fO-of-Integers.html

例如:

mpz_t num1, num2;
mpz_init(num1);
mpz_init(num2);

while (mpz_inp_str(num1, fp, 10) && mpz_inp_str(num2, fp, 10)) {
    // do something with num1 and num2
}

GMP 为您提供无限的精度,因此您可以存储任意长度的数字,并对它们进行数学运算。

【讨论】:

  • 数字可以是任意大小,所以我无法像 int 一样阅读。
  • @TrapezeraBuscando:好的,我现在更新了我的答案以允许读取任意长度的整数。
【解决方案2】:

如果你采用long double格式,相信你几乎可以处理任何合理的“大小”,而且你不必担心“处理行长”。

 long double num1, num2;

 while (fscanf(fp, "%Lf %Lf\n", &num1, &num2) == 2){
    printf("%Lf\t%Lf\n", num1, num2);
 //copy the numbers into whichever appropriate array
 }

【讨论】:

  • 不幸的是,这些数字的大小不合理。我真的不能使用任何数据类型来存储它。有没有办法逐个字符地读取它,直到空白并将每个字符存储到第一个数组中,然后对第二个数组再次执行此操作直到行尾?
  • 代替您,假设您处理的是常规文件,我会以尽可能少的步骤摆脱文件读取。 (1) 声明一个足够大的字符数组buf[512][512],由于堆栈大小的考虑,不能保证上限。 (2) 使用 int i = 0; while(fscanf(fp, "%s", buf[i++]) == 1); fclose(fp) 将文件读入该数组。然后你可以用这个 char 数组做任何你喜欢的事情。单个数字符合char 格式,不需要任何ints 数组。
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2022-01-25
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多