【问题标题】:Reading data from a text file to an array and sending it using shared memory in c将数据从文本文件读取到数组并使用 c 中的共享内存发送
【发布时间】:2018-01-08 17:19:01
【问题描述】:

这是我第一次直接寻求帮助。我正在尝试从文本文件中读取数据,然后使用共享内存将其发送到其他进程。共享内存按预期工作,问题是数组只填充了前 15 个字符,然后它一遍又一遍地发送这 15 个字符,直到它到达 EOF。我希望数组用文件中的新字符重新填充自己,只是不知道如何。这是我的代码的一部分。

编辑:我发现由于某种原因(可能是我的错误)填充数组后偏移量没有向前移动,所以我手动设置偏移量来移动。它解决了只读取文件的前 15 个字符的问题,但并不理想。在阅读文件时,有时会丢失一些字母,有时会切换单词的顺序。 有人可以向我解释为什么会发生这种情况,我该怎么办?

EDIT2:我想我自己解决了这个问题,下面是编辑过的代码,大部分时间看起来都很好。如果有人能想到更好的实现,请不要犹豫发布它。目前,我的解决方案似乎“足够好”

EDIT3:我仍然缺少一些字母,但我增加了共享内存空间,就像你说的那样,现在共享更长的单词实际上不是问题。

int z;
int i;
char text[256];
while(1) {
  FILE* fp = fopen("/path/to/my/file", "r");
  if (fp) {  
     fseek(fp, z, SEEK_SET);
    while(fscanf(fp,"%s",text)!=EOF) {

      s = shm;
        for (int i = 0; i < SHM_SIZE; i++) { //this loop loads characters from array to a shared memory
        *s++ = text[i];
         z++;
      }
    }
  fclose(fp); }
}

【问题讨论】:

  • 请问这是什么格式?
  • 我不知道现在好些了吗?
  • 不!情况更糟。
  • 现在完美了
  • 你为什么要使用这么小的缓冲区? fscanf 会很高兴地吹过该阵列的末端。您可能正在寻找fread

标签: c arrays file


【解决方案1】:

您在循环的每次迭代期间重新初始化s = shm;,这意味着您将每一行写入共享内存的开头。如果您想用文件填充所有共享内存,请在循环之前对其进行一次初始化。

这是一项学校作业,但在现实世界中,您可能只是对文件使用共享内存映射。

【讨论】:

  • 我把它移出了循环,它没有改变任何东西
猜你喜欢
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2018-10-16
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多