【问题标题】:Correctly store content of file by line to array and later print the array content正确地将文件内容逐行存储到数组中,然后打印数组内容
【发布时间】:2014-12-04 04:21:04
【问题描述】:

我在读取数组内容时遇到了一些问题。我不确定我是否正确存储它,因为每行的结果都是“1304056712”。

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

#define INPUT "Input1.dat"

int main(int argc, char **argv) {
 int data_index, char_index;
 int file_data[1000];

  FILE *file;
  int line[5];
  file = fopen(INPUT, "r");

  if(file) {
   data_index = 0;

   while(fgets(line, sizeof line, file) != NULL) {
    //printf("%s", line); ////// the line seems to be ok here
    file_data[data_index++] = line;
   }

   fclose(file);
  }

  int j;
  for(j = 0; j < data_index; j++) {
   printf("%i\n", file_data[j]); // when i display data here, i get '1304056712'
  }

 return 0;
}

【问题讨论】:

  • 文件 Input1.dat 是什么样的?它是一个数字列表,每行一个吗?
  • 缓冲区溢出示例

标签: c arrays type-conversion fgets


【解决方案1】:

我认为你需要说类似的话

file_data[data_index++] = atoi(line);

【讨论】:

  • 正确。谢谢。
【解决方案2】:

根据您的结果,我假设该文件是纯文本文件。

您不能简单地将文件中的行(字符串、字符数组)读入整数数组,这是行不通的。当使用指针(通过将line 传递给fgets())写入数据时,不会进行任何转换。相反,您应该将该行读入一个字符数组,然后使用sscanf()atoi() 或您选择的其他函数将其转换为整数。

【讨论】:

    【解决方案3】:

    fgets 读取换行符终止的字符串。如果您正在读取二进制数据,则需要fread。如果您正在阅读文本,则应将 line 声明为一个足够大的字符数组,以容纳文件中最长的行。

    因为 file_data 是一个 char 数组,所以 file_data[data_index] 是单个字符。它被分配了一个指针(int line[5] 缓冲区的基地址)。如果读取二进制数据,file_data 应该是一个整数数组。如果读取字符串,应该是字符串数组,即char指针,如char * file_data[1000]

    您还需要在 if (file) ... 块之外初始化 data_index=0,因为即使文件无法打开,输出循环也需要设置它。并且在循环和存储输入时,循环应该测试它没有达到存储到的数组的大小。

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2014-07-14
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多