C - 从文件中读取文本/句子到字符串数组

时间:2016-10-25 21:49:56

标签: c arrays string file scanf

我是初学者,在大学学习。在这一刻。 我的作业:写一个基于文本的adventere游戏(经过不到2个月的编程研究:/)。

老师说游戏正在使用的文本应该存储在一个文件中。 一开始,程序应该读入"所有文本"从该文件,然后,程序应该使用字符串中的文本(我猜)。

我的第一个想法是,我会将1个句子读成1个字符串,但这只是不想解决,因为句子在课程之间有空格,但当我尝试阅读时,当程序看到一个空格,它将单词存储在另一个字符串中而不是相同的字符串中。

因此,正因为如此,例如: 我的txt文件中有4行: 第1行:你应该走哪条路? 第2行:前进 第3行:左 第4行:正确

我认为当我将文本读入4个字符串时,LINE 1将位于第一个字符串中,LINE 2将位于第二个字符串中,等等。 但是发生了什么? '其中'是在第一个字符串,"方式"是在第二个字符串等。

抱歉这个错误的解释,但我希望你们明白我的问题是什么。 如何才能将第1行读入第一个字符串? 我认为程序不会将空间计为"好吧,我应该把这个空格后面的单词放到一个新字符串中#34; ..

这是我的代码导致了这个"错误":

char decisions[4][200];
FILE *fp;
fp=fopen("text.txt", "r");
fscanf(fp, "%s %s %s %s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]);
fclose(fp);

printf("%s\n %s\n %s\n %s\n", decisions[0], decisions[1], decisions[2], decisions[3]);

决策[0]应该从我的txt文件的第一行读入问题,而另外3个应该有3个选择选项。这就是我想要发生的事情:/

3 个答案:

答案 0 :(得分:1)

要逐行阅读,您可以使用fgets。如果你知道每个字符串的MAX字节是200并且你有4行,那么将它传递给fgets进入这个循环:

int i;
for (i=0; i<3; i++)
  {
    fgets(decisions[i], 200, fp);
  }

fgets将n个字节读入缓冲区,直到找到新行或EOF。因此,请确保每一行每行不超过200个字符。

答案 1 :(得分:0)

虽然你不应该,可以使用fscanf来完成。

text.txt

的内容
"Whussup?" "All of the things that have not been screwn tightly to the ground" "Buh, who cares!" "You don't wanna know, mate!"
"Why?" "Because!" "Ask Joe!" "I'm a doctor, not an engineer!"

第一行可以解析:

#include <stdio.h>
#include <stdlib.h>
// ALL CHECKS OMMITTED!
int main()
{
  FILE *fp;
  char decisions[4][200];

  fp = fopen("text.txt", "r");
  fscanf(fp, "\"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\"",
         decisions[0], decisions[1], decisions[2], decisions[3]);
  fclose(fp);
  printf("LINE1: %s\nLINE2: %s\nLINE3: %s\nLINE4: %s\n", decisions[0],
         decisions[1], decisions[2], decisions[3]);
  exit(EXIT_SUCCESS);
}

技巧是\"%199[^\"]\",它最多需要199个不是"的字符,并且在双引号后面跟一个空格。但text.txt的格式必须严格或不起作用!

但实际上,尝试使用fgets或类似的方法,可以减少大量的头痛!

答案 2 :(得分:-2)

在格式字符串

中明确使用换行符作为分隔符
fscanf(fp, "%s[\n]%s[\n]%s[\n]%s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]);