将字符串写入文件

时间:2013-06-11 00:26:57

标签: c file

所以我要做的就是按顺序将这些文件写入文件。我想过使用'for'循环,但是我不知道如何去做,因为如果我使用stri和i作为变量,代码将无法正常工作。我基本上只是在寻找建议。提前致谢。

int main(void)              //Main calls the functions.  

FILE *fp_out; 

char str1[] = "That means today is Monday! \n";
char str2[] = "That means today is Tuesday! \n";
char str3[] = "That means today is Wednesday! \n";
char str4[] = "That means today is Thursday! \n";
char str5[] = "That means today is Friday! \n";

fp_out = fopen("strings.txt", "w");

//int i;
//for (i=1; i>5; i++)
//{
//fputs(str[i]

最后一行被注释掉,但它们是我尝试的for循环的开始。

6 个答案:

答案 0 :(得分:3)

因为您为每个字符串使用了不同的变量名,所以不能直接在循环中执行此操作(不使用这些指针的数组)。将字符串放入数组开头可能更简单:

const char * str[5] = {
    "That means today is Monday! \n",
    "That means today is Tuesday! \n",
    "That means today is Wednesday! \n",
    "That means today is Thursday! \n",
    "That means today is Friday! \n"
};

然后你可以正常循环:

for( i = 0; i < 5; i++ ) fputs( str[i], fp_out );

这与您原来的方法略有不同。因为你的被声明为char数组,所以你实际上可以修改它们,而我在这里使用的字符串文字是常量(即使你省略了const关键字)。但我认为你不想在执行过程中修改它们。

答案 1 :(得分:2)

如果将所有字符串存储在单个数组中,则可以使用for循环:

char *strings[] = {str1, str2, str3, str4, str5};

现在可以使用索引遍历数组并单独编写每个字符串:

int i;
for (i = 0; i < 5; ++i) {
    fputs(strings[i], fp_out);
}

答案 2 :(得分:1)

#include <stdio.h>

int main() {
    char *strs[] = {
      "That means today is Monday! \n",
      "That means today is Tuesday! \n",
      "That means today is Wednesday! \n",
      "That means today is Thursday! \n",
      "That means today is Friday! \n",
      0
    };
    FILE *fp_out = fopen("strings.txt", "w");
    for (char **p = strs; *p; p++) {
        fprintf(fp_out, "%s", *p);
    }
    fclose(fp_out);
    return 0;
}

答案 3 :(得分:0)

正如其他人所指出的那样使用数组可能就是您正在寻找的方法。但是,您也可以使用<stdarg.h>和一个带有可变数量参数的函数:

void print_strings (FILE *fp_out, ...) {
    va_list ap;
    va_start(ap, fp_out);
    for (const char *p; (p = va_arg(ap, const char *)); /*empty*/) {
        fputs(p, fp_out);
    }
    va_end(ap);
}

/* ... */
print_strings(fp_out, str1, str2, str3, str4, str5, (const char *)0);

对sentinel值的强制转换是必要的,以防止将int参数放入函数中,因为函数只需要const char *个参数。

答案 4 :(得分:0)

以下是@paddy的回答:

const char * str[5] = {
    "That means today is Monday! \n",
    "That means today is Tuesday! \n",
    "That means today is Wednesday! \n",
    "That means today is Thursday! \n",
    "That means today is Friday! \n"
};

如果你加周六和周​​日怎么办?您需要将5更改为7。好消息:如果您忘记进行更改,C编译器会注意到字符串的数量与声明的数组大小不同,您将收到错误。

但是嗯。那为什么我们必须指定数组的长度? C编译器难道不能确定它应该对我们有多长时间吗?

事实上,是的。我们所要做的就是省略数字,C编译器将计算数组中的数量并使数组完全相同。

但是,当我们去打印字符串时,我们怎么知道有多少字符串呢?有两种常见的方法可以解决这个问题。

一种是在数组的末尾放置一个特殊的标记,通常称为“sentinel”值。这里一个不错的选择是NULL

因此,让我们对示例进行更改:让编译器为我们计算,并在最后添加一个标记:

以下是@paddy的回答:

char const *str[] = {
    "That means today is Monday! \n",
    "That means today is Tuesday! \n",
    "That means today is Wednesday! \n",
    "That means today is Thursday! \n",
    "That means today is Friday! \n",
    NULL
};

现在我们可以重写循环以检查sentinel值:

for (i = 0; str[i]; ++i)
    fputs(str[i], fp_out);

这将循环并打印,直到str[i]的值变为false。 NULL指针将评估为false,停止循环。

了解清单中有多少东西的另一种方法有点棘手。我们可以使用sizeof()功能来查找数组的大小,但是这个大小是以sizeof(char)表示的(在大多数平台上,这意味着字节)。但我们可以将总大小除以一个元素的大小。这可行:

static int const str_count = sizeof(str) / sizeof(char const *);

但如果更改str的类型会怎样?然后你需要记住在sizeof(char const *)中更改它。更好的是,您可以使用str本身来确定元素的大小。像这样:

static int const str_count = sizeof(str) / sizeof(str[0]);

我们甚至可以把它打包成一个宏:

#define ARRAY_LEN(a)  (sizeof(a) / sizeof((a)[0]))

static int const str_count = ARRAY_LEN(str);

这是循环:

for (i = 0; i < str_count; ++i)
    fputs(str[i], fp_out);

或者,用宏:

for (i = 0; i < ARRAY_LEN(str); ++i)
    fputs(str[i], fp_out);

答案 5 :(得分:-1)

您可以使用for循环,而不是创建五个单独的数组,而是创建array of arrays

char* strings[5];
strings[0] = "That means today is Monday! \n";
strings[1] = "That means today is Tuesday! \n";
...

然后你的for循环需要打印strings[i]i的范围是0到4。

相关问题