Thread: open read write close

  1. #1
    Registered User
    Join Date
    Aug 2009
    Posts
    18

    open read write close

    As a progression from the first thread,
    which was solved, using fread fscanf fprintf and fclose
    (fscanf seg fault)

    I'm trying to write the same program,
    but in this assignment, I must not use any of the above calls,
    but instead use open, read, write, and close.


    My code so far compiles fine,
    and seems to run, it creates or opens the output file fine,
    but doesn't append the input files to it.

    I think it's a problem with the read call,
    but as I said, I'm new to C!

    Any ideas welcome

    Code:
    #include <stdio.h>
    #include <fcntl.h>
    #define STR(arg) #arg
    
    #define BUF_SIZE 160
    
    #define BUF_FORMAT "%160[^\n]s"
    
    char buf[BUF_SIZE];
    FILE *output, *input, *buffer;									/* declarations*/
    
    int i,j,openstatone,openstattwo;
    
    
    
    int main (int argc, char *argv[])
    	{
            if ( argc < 2 ) 								/* Error message if no Args entered */
    		{
    		write(1,  "\n **************** \n Not enough Arguments Supplied\n ****************\nPlease enter an Output file to append to, followed by any input files\n \n",  142);
    		
    		return 1;
    		}	
    	else  										/*Output file opened or created */
    		{
    		openstatone = open(argv[1], O_CREAT, 0777);
    		}
    	if (openstatone > 0)
    		{
    
    		if (argc == 2)									/*If only one Arg entered*/
    			{
    			write (1, "No input files appended to Output File.\n", 40);			
    			return 0;
    			}
    		else										/* start append section */
    			{
    			i = argc -2;
    			j = 2;
    			printf ("i = %d\n", i);
    			printf ("j = %d\n", j);
    		
    	
    	
    			while (i > 0)								/*Loop through all input files*/
    				{
    				/*printf ("%s\n", argv[j]);*/					/* Used for Error Checking*/
    				openstattwo = open(argv[j], O_RDONLY);
    
    				if (openstattwo > 0)						/*Check fopen worked */
    					{
    					read (argv[j], buf, 160);
    					printf("%s\n", buf);    				/* Used for Error Checking */
    					write (argv[1], "%s\n", buf);						
      					close(argv[j]);
    					write (1,"SUCCESS! Input File: %s was Successfully appended\n", argv[j], 80);				
    					}
    				else
    					{
    					write (1, "FAILURE! Input File: %s Failed to Open or does not exist\n", argv[j], 80);
    					}
    				j ++;
    				i --;
    				}
    			write (1, "\nFiles Appended Successfully\n\n", 80);				/*Files Appended Successfully*/
    			close(argv[1]);			
    			return 0;
    			}
    		}
    	else
    		{	
    		/*write (1, "Output file failed to Open", 80);*/
    		return 1;		
    		}
    	}

  2. #2
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    If you want to append, why not use O_APPEND?

  3. #3
    Registered User
    Join Date
    Aug 2009
    Posts
    18
    Well I thought that O_CREAT would create the file and open it. Or just open it if it already exists.

    O_APPEND wouldn't open it if the file didn't exist would it?

    Well that was my thinking anyway!

  4. #4
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    You're thinking that these flags are mutually exclusive. They are not. You are supposed to | together the ones you want.

  5. #5
    Registered User
    Join Date
    Aug 2009
    Posts
    18
    Ah okay,
    Changes made.

    Still the same problem persists. The input files input isn't being read

    I think the problem is with the read statement...

    Tidied a bit

    Code:
    #include <stdio.h>
    #include <fcntl.h>
    #define STR(arg) #arg
    
    #define BUF_SIZE 160
    
    #define BUF_FORMAT "%160[^\n]s"
    
    char buf[BUF_SIZE];
    FILE *output, *input, *buffer;									/* declarations*/
    
    int i,j,outfp,infp,fileread;
    
    
    
    int main (int argc, char *argv[])
    	{
            if ( argc < 2 ) 								/* Error message if no Args entered */
    		{
    		write(1,  "\n **************** \n Not enough Arguments Supplied\n ****************\nPlease enter an Output file to append to, followed by any input files\n \n",  142);
    		
    		return 1;
    		}	
    	else  										/*Output file opened or created */
    		{
    		outfp = open(argv[1], O_CREAT | O_APPEND, 0777);
    		}
    	if (outfp > 0)
    		{
    
    		if (argc == 2)									/*If only one Arg entered*/
    			{
    			write (1, "No input files appended to Output File.\n", 40);			
    			return 0;
    			}
    		else										/* start append section */
    			{
    			i = argc -2;
    			j = 2;
    			printf ("i = %d\n", i);
    			printf ("j = %d\n", j);
    			
    			while (i > 0)								/*Loop through all input files*/
    				{
    				/*printf ("%s\n", argv[j]);*/					/* Used for Error Checking*/
    				infp = open(argv[j], O_RDONLY);
    
    				if (infp > 0)						/*Check fopen worked */
    					{
    					printf ("testing 1\n\n\n");
    					
    					fileread = read (infp, buf, 160);
    					printf("%s\n", buf);    				/* Used for Error Checking */
    					write (outfp, buf, 160);						
      					close(infp);
    					write (1,"SUCCESS! Input File: %s was Successfully appended\n", argv[j], 80);				
    					}
    				else
    					{				
    					write (1, "FAILURE! Input File: %s Failed to Open or does not exist\n", argv[j], 80);
    					}
    				j ++;
    				i --;
    				}
    			write (1, "\nFiles Appended Successfully\n\n", 80);				/*Files Appended Successfully*/
    			close(outfp);			
    			return 0;
    			}
    		}
    	else
    		{	
    		/*write (1, "Output file failed to Open", 80);*/
    		return 1;		
    		}
    	}
    Last edited by mercuryfrost; 08-20-2009 at 02:19 PM. Reason: update

  6. #6
    Registered User
    Join Date
    Sep 2008
    Location
    Toronto, Canada
    Posts
    1,834
    What is this stuff:
    Code:
    read (argv[j], buf, 160);
    printf("%s\n", buf);    /* Used for Error Checking */
    write (argv[1], "%s\n", buf);
    read(), write() and close() expect a file handle... not some string as its first argument.
    Also, you can't use formatters.
    Last edited by nonoob; 08-21-2009 at 03:57 PM.

  7. #7
    Registered User
    Join Date
    Aug 2009
    Posts
    18
    I think I had already changed that when you had posted.

    Did I?

    Or is it this you're referring to?
    Code:
    infp = open(argv[j], O_RDONLY);
    If that won't work, any suggestions?

  8. #8
    Registered User
    Join Date
    Sep 2008
    Location
    Toronto, Canada
    Posts
    1,834
    No, the open() looks OK, argument-type-wise.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Read from txt and write in an external program
    By sombrancelha in forum C Programming
    Replies: 8
    Last Post: 06-01-2009, 09:04 PM
  2. Replies: 1
    Last Post: 05-27-2009, 12:46 PM
  3. Replies: 6
    Last Post: 04-17-2009, 04:41 PM
  4. Replies: 3
    Last Post: 03-04-2005, 02:46 PM
  5. Ghost in the CD Drive
    By Natase in forum A Brief History of Cprogramming.com
    Replies: 17
    Last Post: 10-12-2001, 05:38 PM