如何从read()中获取字符

时间:2013-10-11 23:30:58

标签: c

我正在尝试复制文件,仅使用open()read()write()向后打印。 但是我想知道是否有办法从读取中获取char指针,返回读取的字节数。如果是这样我怎么去做我尝试过一次,但我最终得到了一个错误

error: invalid type argument of ‘unary *’ (have ‘ssize_t’)

这是我正在使用的代码片段

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main (int argc, char *argv[])
{
 if(argc != 3)/*argc should be 2 for correct execution*/
 {
  printf("usage: %s filename",argv[0]);
 }
 else
 {
  int file1 = open(argv[1], O_RDWR);
  if(file1 == -1){
    printf("\nfailed to open file.");
    return 1;
  }
  int reversefile = open(argv[2], O_WRONLY, O_CREAT);
  int size =(int)lseek(file1, 0, SEEK_END)+1;
  char file2[size];
  int count=size;
  int i = 0;

  while(read(file1, &file2[count], 1) != 0)
  {
   *file2[i]=*read(file1, file[count], 1);
   write(reversefile, file2[i], size+1);
   count--;
   i++;
   lseek(reversefile, i, SEEK_SET);
   }
}

3 个答案:

答案 0 :(得分:0)

read返回一个size_t值,表示成功读取了多少字节,它没有返回指针。

出于您的目的,您首先需要使用

致电read
read(file1, &file2[count], 1)

然后您可以通过

访问从文件中读取的值
file2[i] = file[count];

我认为你不需要两次致电read

此外,如果您只需要一个字符,则使用getc的字符更好。

char c;
while((c=getc(file1)) != EOF){
  // use c
}  

答案 1 :(得分:0)

  1. 您需要读取文件中的所有行并将其保存到字符串数组中。 这是一个包含100个字符串的数组,每个字符串最多可包含999个字符+ 1('\ 0')

    char myfile[100][1000]
    
  2. 您需要反转字符串。这可以通过非常简单的算法完成。例如:如果你的字符串是“ABCDE”,你可以交换'A'和'E','B'和'D'。每当你用你的战利品获得strlen(myfile [i])/ 2并且你在第i个位置和(strlen(myfile [i]) - 1 - i-th)位置交换角色。

  3. 现在您可以在output.txt文件中写入所有字符串,但顺序相反。

    #include <stdio.h>
    #include <string.h>
    
    char myfile[100][1000];
    int n;
    
    void readmyfile(void)
    {
        int i;
        FILE *input = fopen("input.txt", "r");
        printf("This is in your file:\n");
        for(i = 0; fscanf(input, "%[^\n] ", myfile[i]) != EOF; i++)
            printf("%s\n", myfile[i]);
        n = i;
        fclose(input);
    }
    
    void reverseall(void)
    {
        int i, j, len;
        char swap;
        for(i = 0; i < n; i++)
        {
            len = strlen(myfile[i]);
            for(j = 0; j < len / 2; j++)
            {
                swap = myfile[i][j];
                myfile[i][j] = myfile[i][len - 1 - j];
                myfile[i][len - 1 - j] = swap;
            }
        }
    }
    
    void writetooutput(void)
    {
        int i;
        FILE *output = fopen("output.txt", "w");
        printf("This is your output file:\n");
        for(i = n - 1; i >= 0; i--)
        {
            fprintf(output, "%s\n", myfile[i]);
            printf("%s\n", myfile[i]);
        }
        fclose(output);
    }
    
    int main()
    {
        readmyfile();
        reverseall();
        writetooutput();
        return 0;
    }
    

答案 2 :(得分:0)

逆向?为了好玩,一个递归的解决方案。无需stat()seek()

注意ssize_t len = read(inf, buf, N);len,如果&gt; = 0是读取的字节数,则发生错误。 len为0通常表示文件结束。

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

int read_R(int inf, size_t N) {  // return 0 is good, else error
  int result = 0;
  char *buf = malloc(N);
  if (buf == NULL) {
    return -1;  // Out of memory
  }
  ssize_t len = read(inf, buf, N);
  if (len > 0) {
    // read & print remainder of file
    result = read_R(inf, N*2);
    // print this buffer in reverse
    while (len > 0) {
      putchar(buf[--len]);
    }
  }
  free(buf);
  if (len < 0) { // Some I/O error, see errno
    return 1;
  }
  return result;
}

// Usage
int inf = open(...);
if (read_R(inf, 4096)) {
  ; // error
}
else {
  ; // OK, every thing read and printed in reverse, memory free'd
}
close(inf);