通过while循环了解文件i / o

时间:2015-03-07 05:17:45

标签: c arrays file-io

此程序的控制台输出是按预期的,但写入文本文件的输出不反映此情况。我很确定这是因为y(++)的增加,但我不知道如何在不弄乱逻辑流的情况下解决问题,到目前为止我的尝试都不太成功。我一直在研究这个问题,所以如果你以前见过我,请原谅我的进展缓慢,我正在学习,我去了!

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

#define MAX_STR_LEN 120

int main(){

char *cArray[MAX_STR_LEN] = { "example", "dinosaurs" };
char cInput[MAX_STR_LEN] = { 0 };
int y = 0;
FILE *pWrite;

printf("Type your message:\n");
fgets(cInput, MAX_STR_LEN, stdin);
cInput[strlen(cInput) - 1] = 0;     /* strip newline from input */
printf("\nInitialised string array:\n");

time_t rawtime;
struct tm * timeinfo;

time ( &rawtime );
timeinfo = localtime ( &rawtime );

while (cArray[y]){
    char * ptr = cInput;
    while ((ptr = strstr(ptr, cArray[y])) != NULL){
        char *ep = strchr (ptr, ' ');
        if (ep) *ep = 0;              /* null-terminate at space */
        printf("%s\n", ptr);
        if (ep) *ep = ' ';            /* put the space back      */

        pWrite = fopen("test.txt", "a");
        if ( pWrite != NULL ) {
            fprintf(pWrite, "%s\n", ptr++);
            fprintf(pWrite, "%s\n", asctime (timeinfo));
            fclose(pWrite);
        } else {
            goto ErrorHandler; //there is a file i/o error
        }
    }
    y++;
    }
printf ( "Timestamp: %s", asctime (timeinfo) );

exit(EXIT_SUCCESS); //exit program normally

ErrorHandler:
perror("The following error occurred");
exit(EXIT_FAILURE); //exit program with error
}

控制台输出:

Type your message:
this is an example of dinosaurs
Initialised string array:
example
dinosaurs
Timestamp: Sat Mar  7 16:04:42 2015
Program ended with exit code: 0

文件输出:

example of dinosaurs
Sat Mar  7 16:04:42 2015

dinosaurs
Sat Mar  7 16:04:42 2015

预期的文件输出:

Initialised string array:
example
dinosaurs
Timestamp: Sat Mar  7 16:04:42 2015

1 个答案:

答案 0 :(得分:1)

嗯,对于初学者来说,cArray [y]永远不会是NULL ..它是“示例”,“恐龙”,然后是未定义的。因此外部while循环可能会持续很长一段时间。我想你想明确定义

char *cArray[] = { "example","dinosaurs",NULL };  

这可以保证外部while循环终止。但你问的真正问题实际上并不像你想象的那么糟糕。

首先,在printf到控制台之前,你明确地在字符串中添加了一个null终止符,但是在你写入文件之前你又删除了它:

将sting截断为一个单词:

    char *ep = strchr (ptr, ' ');
    if (ep) *ep = 0;              /* null-terminate at space */

打印

    printf("%s\n", ptr);
    if (ep) *ep = ' ';            /* put the space back      */

当我们写入文件时,它再次显示完整的字符串:

    pWrite = fopen("test.txt", "a");
    if ( pWrite != NULL ) {
        fprintf(pWrite, "%s\n", ptr++);
        fprintf(pWrite, "%s\n", asctime (timeinfo));
        fclose(pWrite);

所以当你把它写入文件“恐龙的例子”时,你会看到字符串的完整剩余部分。然后第二次,你看到恐龙就像你应该的那样,因为它恰好是弦乐的最后一个字。

接下来,每次通过内循环打印出日期戳。这就是日期戳显示两次的原因。此外,您根本不会将“初始化字符串数组”字符串写入文件(仅使用printf,而不是fprintf)。

希望有所帮助。