如何从文本文件中读取字符串中的每个单词

时间:2015-11-11 19:22:57

标签: c

我的代码如下所示:

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

int main()
{
    FILE *fp = fopen("text.txt", "r");
    char c;
    int d = 0;
    char arr[2000];

    do {
        c = fgetc(fp);
        d = d + 1;

        if (c == '\n') {
            arr[d] = ' ';
        } else
            arr[d] = c;
    } while (c != EOF);

    int z = strlen(arr);
    arr[0]= '\0';

    for (int i = 0;i < z; i++) {
        arr[i] = arr[i +1];
    }

    fclose(fp);

    return 0;
}

代码从文本文件中读取一个字符串,然后将它们转换为数组arr [2000](文本文件中有很多单词)。我想询问是否有人知道代码读取文本文件的方法,每个单词由空格分隔而不是字符。

所以例如,如果我有一个带字符串的数组arr:&#34;杰克是个男孩&#34;

arr [0]等于&#34;杰克&#34;不是&#34; J&#34;

p.s(删除索引0的for循环的原因是因为我一直得到一个&#34;(&#34;字符在数组的开头)

任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:6)

你说:

  

例如,如果我有一个带字符串的数组arr:"Jack is a boy"

     

arr[0]等于"Jack"而不是"J"

为此,arr[0]需要是指向空终止字符串的指针。这意味着,arr必须是一个指针数组,而不是char的数组。

char* arr[SOME_SIZE] = {0}; // Make SOME_SIZE large enough for your needs.

现在你必须找出存储从文件中读取的字符的位置。您可以使用Easiest way to get file's contents in C中使用的方法来读取文件的全部内容。假设你有代码来读取文件的内容,那就让我们:

char* fileContents = readFileContents("text.txt");

现在,fileContents指向一个类似于:

的数组
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
| J | a | c | k |   | i | s |   | a |   | b | o | y | \0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

现在,您需要遍历该数组并确保:

  1. arr[0] - arr[3]指向数组中的正确位置。
  2. 将空白字符替换为空字符,以便arr[0] - arr[3]指向以空字符结尾的字符串。
  3. arr[0]              arr[1]       arr[2]   arr[3]
    |                    |            |        |
    v                    v            v        v
    +---+---+---+---+----+---+---+----+---+----+---+---+---+----+
    | J | a | c | k | \0 | i | s | \0 | a | \0 | b | o | y | \0 |
    +---+---+---+---+----+---+---+----+---+-- -+---+---+---+----+
    

    我希望能为您提供足够的信息来实现您所需的功能。

答案 1 :(得分:3)

您可以在一开始就获得额外的角色,因为您开始在arr[1]填充数组。

此外,您可以使用fread功能让生活变得更轻松: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 一次读入整个文本块。 然后,您可以随意将其分为单词。

现在,如果你还想要一个数组&#34;包含&#34;所有单独的单词,您应该查看array of pointers to charchar *array[100](当然适当的大小)。 C不会自动处理字符串(正如您对问题的最后一点所期待的那样#34; arr [0]等于&#34; Jack&#34; not&#34; J&#34;& #34;

答案 2 :(得分:1)

您还需要查看三个额外的细微问题:

int c = 0;  /* note: 'c' should be 'int' */

虽然char适用于普通字符,但如果您尝试读取包含多字节字符的文件,则会遇到问题。

当您使用fopen打开文件时,您需要在尝试从中读取文件之前检查该文件是否已打开。只需要一个简单的测试:

if (!fp) {  /* validate file open succeeded */
    fprintf (stderr, "error: file open failed 'text.txt'.\n");
    return 1;
}

(注意:if (!fp)只是if (fp == NULL)

的简写

接下来是您阅读c的方式,将其分配给array,然后测试c = EOFcEOF时会添加到数组中的内容?

在将c = EOF分配给c之前,您需要先测试arr,如果是EOF-1 generally,则不需要分配/* test c before you add it to the array */ while ((c = fgetc (fp)) != EOF) { if (c == '\n') { arr[d++] = ' '; } else arr[d++] = c; } arr[d] = 0; /* null-terminate, note '\0' = 0 */ 。快速更改循环将起作用:

yield from x