不打印文件的前5个字符

时间:2014-06-17 01:16:39

标签: c printf fgetc

从文件读取并打印结果的循环不会从所有读取的文件中打印前5个字符。如果我一次打印1个字符它工作正常,但我正在读取文件中的浮点数,我需要稍后处理。这些数字是由空白区域分隔的,这就是为什么我只是在遇到空白区域时才打印。

这是我的源代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

#define BUFFER_SIZE 100
#define READ_END 0
#define WRITE_END 1

//main function
int main(int argc, char *argv[])
{
    //process ids
    int processIds[argc - 1];
    int pipes[argc - 1][2];
    char *fileNames[argc - 1];
    int status; 

    //check if at least one data file
    if (argc == 1)
    {
        return -1;
        //end program    
    }

    //get file names and store in array fileNames
    int i;
    for (i = 0; i < (argc - 1); i++)
    {
        fileNames[i] = argv[i + 1];
    }    

    //create child processes
    for (i = 0; i < (argc - 1); i++)
    {
        //make a pipe for communication
        if (pipe(pipes[i]))
        {
            printf("bad pipe");
            return -1;
        }
        //make a child process
        processIds[i] = fork();

        //check if child or paren process
        if (processIds[i] == 0)
        {
            //child process
            //close unused end

            close(pipes[i][READ_END]);

            //make file
            FILE *dataset = fopen(fileNames[i], "r");

            //test if file opened
            if (dataset == 0)
            {
                printf("could not find/open file");
                return -1;
            }

            //read and process file
            char *x;
            char *num = "";
            int min, max;
            while ((*x = fgetc(dataset)) != EOF)
            {
                if ((x == " ") || (x == "\t") || (x == "\n"))
                {
                    //end of number
                    printf("A%s B%s", num, num);
                    num = "";
                }
                else
                {
                    strcat(num, x);
                }
                //printf("%c", x);    
            }
            printf("\n\n");
            char msg[BUFFER_SIZE];

            write(pipes[i][WRITE_END], msg, strlen(msg) + 1);
            fclose(dataset);
            exit(0);
        }
        else if (processIds[i] < 0)
        {
            //error
            return -1;    
        }
        else
        {
            //parent process closes write end of pipe
            close(pipes[i][WRITE_END]);
        }
    }

    //wait for children
    for (i = 0; i < (argc - 1); i++)
    {
        //create a read buffer
        char read_buf[BUFFER_SIZE];

        //wait and get pid of completed child
        int pid = wait(&status);

        //find which child completed
        int j = 0;
        while (pid != processIds[j] && j < (argc - 1))
        {
            //pid not recognized, should not happen
            if (j >= (argc - 1))
            {
                printf("bad pid");
                return -1;
            }
            j++;
        }
        //read from completed child
        read(pipes[j][READ_END], read_buf, BUFFER_SIZE);
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

我可以发现以下有关您的代码的错误:

1)内存分配

您需要分配num变量

示例:

char *num = malloc(10);

2)返回类型

'fgetc'不返回指针也不返回char,因此您应该定义

int x;

x = fgetc(dataset);

3)你的情况错了

if ((x == ' ') || (x == '\t') || (x == '\n'))

请注意' '不是" "


现在作为我阅读这些单独字符串的建议:

1)读取缓冲区中的所有文件:

char buff[SIZE];
dataset= fopen("fileName.txt", "r");
   if( dataset!= NULL ){
      while ( !feof(fp ) ){
         memset(buff, '\0', sizeof( buff) );
         fgets(buff, SIZE, (FILE*)dataset);
      }
      fclose(dataset);
   }

2)使用strchr查找下一个space并打印字符串 see example of use here