0

我正在尝试复制文件以仅使用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);
   }
}
4

3 回答 3

0

撤销?为了好玩,递归解决方案。不需要stat()or seek()

注意ssize_t len = read(inf, buf, N);len, 如果 >= 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); 
于 2013-10-12T02:08:58.653 回答
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
}  
于 2013-10-11T23:43:53.543 回答
0
  1. 您需要从文件中读取所有行并将它们保存到字符串数组中。这是一个由 100 个字符串组成的数组,每个字符串最多可以有 999 个字符 + 1('\0')

    char myfile[100][1000]
    
  2. 您需要反转字符串。这可以通过非常简单的算法来完成。例如:如果您的字符串是“ABCDE”,则交换“A”和“E”、“B”和“D”。每次您将 for loot 带到 strlen(myfile[i])/2 并在第 i 个位置和 (strlen(myfile[i]) - 1 - i-th)-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;
    }
    
于 2013-10-12T00:26:33.603 回答